浮点数的机器表示不是我期望的结果

时间:2018-04-08 14:54:26

标签: c++ floating-point cpu-architecture

根据IEEE754标准,
float类型号-1.1f应该像这样表示(十六进制格式):
BF8CCCCCH。

因为-1.1 = -1.00011 [0011] ... = -1.000 1100 1100 1100 1100 1100,
签名字段应为1
指数字段应为127 + 0 = 01111111
所以二进制格式是:
1 01111111 000 1100 1100 1100 1100 1100 = BF8CCCCCH

但实验结果并非我的预期。
这是代码:

#include<cstdio>
#include<cstdint>

int main()
{
    float f = -1.1f;
    uint32_t* pf = reinterpret_cast<uint32_t*>(&f);
    printf("%x", *pf);
    getchar();
    return 0;
}

我单独用CodeBlocks和Visual Studio构建它,都打印结果BF8CCCCD,它不等于BF8CCCCC。

2 个答案:

答案 0 :(得分:3)

当十进制数字转换为二进制浮点数时,这些位不仅被切断。而是将数字四舍五入到最接近的可表示值。

在你的情况下,精确的二进制值将是-1.000 1100 1100 1100 1100 1100 1100 ...,1100永远重复,结果-1.000 1100 1100 1100 1100 1101比-1.000 1100 1100 1100更接近精确值1100 1100是。这两个数字之间的差异(绝对值):

-1.000 1100 1100 1100 1100 1100 1100…
-1.000 1100 1100 1100 1100 1101

是:

0.000 0000 0000 0000 0000 0000 0011…

这两个数字之间的(绝对值)差异:

-1.000 1100 1100 1100 1100 1100 1100…
-1.000 1100 1100 1100 1100 1100

是:

0.000 0000 0000 0000 0000 0000 1100…

由于前一个数字更接近精确值,因此使用它。

(注意:圆形到最近,与低位数相关,是常用的默认模式。根据编程语言和平台,可能有其他舍入模式,例如截断。此外,正确舍入到IEEE 754标准和某些编程语言建议或要求最接近的值,但某些实现可能无法正确执行。)

答案 1 :(得分:-3)

某些“双重”文字不能在内存中准确表示。

文字-1.1似乎是其中一个文字。