浮点数的机器表示不是我期望的结果
float number's machine representation is not my expecting result
根据IEEE754标准,
浮点型数字 -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。
某些 'double' 文字无法在内存中准确表示。
文字 -1.1 似乎是这些文字之一。
当十进制数字转换为二进制时floating-point,这些位不仅被切掉了。相反,数字会四舍五入到最接近的可表示值。
在你的例子中,精确的二进制值是 -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…
由于前者的数字更接近于准确值,因此被使用。
(注意:Round-to-nearest,与更低的数字相关,是通常的默认模式。其他舍入模式,例如截断,可能会根据编程语言和平台而可用。此外,正确舍入IEEE 754 标准和某些编程语言建议或要求最接近的值,但某些实现可能无法正确执行。)
根据IEEE754标准,
浮点型数字 -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。
某些 'double' 文字无法在内存中准确表示。
文字 -1.1 似乎是这些文字之一。
当十进制数字转换为二进制时floating-point,这些位不仅被切掉了。相反,数字会四舍五入到最接近的可表示值。
在你的例子中,精确的二进制值是 -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…
由于前者的数字更接近于准确值,因此被使用。
(注意:Round-to-nearest,与更低的数字相关,是通常的默认模式。其他舍入模式,例如截断,可能会根据编程语言和平台而可用。此外,正确舍入IEEE 754 标准和某些编程语言建议或要求最接近的值,但某些实现可能无法正确执行。)