Представление поплавка в C - PullRequest
8 голосов
/ 17 июля 2010

Я пытался понять представление с плавающей точкой в ​​C, используя этот код (и float, и int - это 4 байта на моей машине):

int x = 3;
float y = *(float*) &x;
printf("%d %e \n", x, y);

Мы знаем, что двоичное представление x будет следующим

00000000000000000000000000000011

Поэтому я бы ожидал, что y будет представлен следующим образом

  • Знаковый бит (первый бит слева) = 0

  • Экспонента (биты 2-9 слева) = 0

  • Мантисса (биты 10-32): 1 + 2^(-22)+2^(-23)

Ведущий к y = (-1)^0 * 2^(0-127) * (1+2^(-22) + 2^(-23)) = 5.87747E-39

Моя программа, однако, печатает

3 4.203895e-45

То есть y имеет значение 4.203895e-45 вместо 5.87747E-39, как я и ожидал. Почему это происходит? Что я делаю не так?

P.S. Я также напечатал значения непосредственно из GDB, так что это не проблема с командой printf.

Ответы [ 3 ]

12 голосов
/ 17 июля 2010

IEEE числа с плавающей запятой с полями экспоненты всех 0 «денормализованы»Это означает, что неявный 1 перед мантиссой больше не активен.Это позволяет представлять действительно небольшие числа.См. Эта статья в Википедии для более подробного объяснения .В вашем примере результат будет 3 * 2 ^ -149

6 голосов
/ 17 июля 2010

-127 в экспоненте зарезервировано для денормализованных чисел.Вы рассчитываете для нормализованных чисел, в то время как ваше плавающее число является денормализованным числом с плавающей запятой.

Денормализованные числа рассчитываются с использованием аналогичного метода, но:

  1. показатель степени равен -126
  2. неявный начальный бит больше не предполагается

Таким образом, это означает, что вместо этого вычисление:

(-1)**0*2**(-126)*(2**(-22)+2**(-23)) = 4.2038953929744512e-45

Выше приведен python, где ** означает то же самое, что и ^

1 голос
/ 17 июля 2010

Подробно описано http://en.wikipedia.org/wiki/IEEE_754-2008 Этот стандарт предполагал, что вы перемещаете левую мантиссу, пока не скрываете первый бит значения (увеличение показателя степени). В вашем случае у вас есть выражение 1 + 2 ^ (- 23) - тогда вы получите правильный ответ 4.9..E-32

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...