3
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编译器。

+3

看一看:http://docs.sun.com/source/806-3568/ncg_goldberg.html – Max 2010-10-01 13:47:51

回答

9

并非所有分数都具有确切的二进制等值,因此将其舍入到最接近的值。

简化示例中,

如果您对馏分3个比特,可以有:

0 
0.125 
0.25 
0.375 
... 

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

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

2

为了提高效率,浮点数通常表示为二进制分数乘以二的幂。这与基数10的表示大致相同,只是有小数部分不能精确地表示为二进制分数。相反,它们表示为近似值。

此外,float通常是32位长,这意味着它不具有所有这么多有效数字。您可以在您的示例中看到它们精确到约8位有效数字。

然而,你打印的数字略微超出了他们的意义,因此你看到了差异。看看你的printf格式字符串文档,看看如何打印更少的数字。

您可能需要精确地表示十进制数;这经常发生在财务应用程序中。在这种情况下,您需要使用特殊的库来表示数字,或者只是将所有数据计算为整数(例如将数量表示为美分而不是美元和美元的分数)。

标准参考是What Every Computer Scientist Should Know About Floating-Point Arithmetic,但它看起来像是非常先进的。另外,如果您想了解详细信息,您可以使用Google浮点格式(特别是IEEE标准格式)或在Wikipedia上查看它们。