Я пытался понять представление с плавающей точкой в 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.