与浮点数混淆

时间:2010-10-01 13:38:03

标签: c floating-point floating-point-precision floating-point-conversion

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,但实际输出是312.339996使用GCC编译器。

2 个答案:

答案 0 :(得分:9)

并非所有小数都具有精确的二进制等价值,因此它会四舍五入到最接近的值。

简化示例,

如果您有3位的分数,您可以:

0
0.125
0.25
0.375
...

0.5具有精确的表示,但0.1将显示为0.125。

当然,真正的差异要小得多。

答案 1 :(得分:2)

为了提高效率,浮点数通常表示为二进制分数乘以2的幂。这与基数10表示一样准确,除了有小数部分不能精确表示为二进制分数。相反,它们表示为近似值。

此外,float通常为32位长,这意味着它没有那么多有效数字。您可以在示例中看到它们准确到大约8位有效数字。

但是,您打印的数字略超出其重要性,因此您会看到差异。查看您的printf格式字符串文档,了解如何打印更少的数字。

您可能需要准确表示十进制数字;这通常发生在金融应用程序中。在这种情况下,您需要使用一个特殊的库来表示数字,或者只是将所有内容计算为整数(例如将金额表示为美分而不是美元和一美元的分数)。

标准参考是What Every Computer Scientist Should Know About Floating-Point Arithmetic,但看起来对你来说非常先进。或者,如果您需要详细信息,可以使用谷歌浮点格式(特别是IEEE标准格式)或在维基百科上查找它们。