根据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。
答案 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似乎是其中一个文字。