我试图用这个代码(既了解在C浮点表示float和int是我的机器上4个字节):
int x = 3;
float y = *(float*) &x;
printf("%d %e \n", x, y);
Run Code Online (Sandbox Code Playgroud)
我们知道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我预期的值.为什么会这样呢?我究竟做错了什么?
PS我也直接从gdb打印了值,所以printf命令不是问题.
指数中的-127保留用于非规范化数字.您的计算是针对标准化数字,而您的浮点数是非规范化浮点数.
非规范化数字使用类似方法计算,但是:
所以这意味着计算是:
(-1)**0*2**(-126)*(2**(-22)+2**(-23)) = 4.2038953929744512e-45
Run Code Online (Sandbox Code Playgroud)
以上是python,其中的**含义相同^