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特别标准格式),或看看他们在维基百科上,如果你想要的细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top