-
27-09-2019 - |
题
int main()
{
float x=3.4e2;
printf("%f",x);
return 0;
}
输出:
340.000000 // It's ok.
但是,如果写x=3.1234e2
输出312.339996
并且如果x=3.12345678e2
输出是312.345673
。
为什么喜欢这些输出?我认为,如果我写x=3.1234e2
输出应为312.340000
,但使用GCC编译的实际输出是312.339996
。
解决方案
不因此被四舍五入到最近的值的所有分数具有精确的二进制等效值。
简化示例中,
如果您对馏分3个比特,可以有:
0
0.125
0.25
0.375
...
0.5具有一个精确的表示,但0.1将显示为0.125。
当然真正的差异小得多。
其他提示
浮点数通常表示为二进制小数倍的2的幂,为了效率。这是一个关于精确作为碱-10表示,不同之处在于有不能准确地表示为二进制小数小数。它们是,相反,表示为近似值。
此外,float
通常为32位长,这意味着它不具有所有许多显著数字。你可以在你的例子看到他们精确到约8显著位。
您,然而,印刷的数字稍微超出了他们的意义,因此,您所看到的差异。看看你printf
格式字符串的文件,看看如何打印更少的位数。
您可能需要准确地表示十进制数;这往往发生在金融应用。在这种情况下,你需要使用专门的库来表示数字,或简单地计算一切为整数(如代表金额由美分而不是美元和美元的分数)。
在标准的参考是什么每台计算机科学家应该知道浮点运算,但它看起来像会为您非常先进。或者,你可以谷歌的浮点格式(IEEE特别标准格式),或看看他们在维基百科上,如果你想要的细节。
不隶属于 StackOverflow