为什么在C中添加两个浮点数是不正确的?

时间:2011-09-07 12:55:21

标签: c floating-point

我在添加两个浮点数时遇到问题。 代码如下:

float a = 30000.0f;
float b = 4499722832.0f;

printf("%f\n", a+b);

为什么输出结果为450002816.000000? (正确的应该是450002832。)

3 个答案:

答案 0 :(得分:7)

Float没有在C中完全表示 - 请参阅http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computershttp://en.wikipedia.org/wiki/Single_precision,因此使用float计算只能得出近似结果。

这对于较大的值尤其明显,因为可能的差异可以表示为值的百分比。在添加/减去两个值的情况下,两者(和结果)的精度都会更差。

答案 1 :(得分:3)

浮点值不能代表所有整数值。

请记住,单精度浮点数只有24(或23,取决于你如何计算)精度位(即有效数字)。因此,随着值变大,您开始失去低端精度,这就是计算结果不太“正确”的原因。

答案 2 :(得分:2)

来自wikipedia

  

单一精度,在C语言系列中称为“float”,在Fortran中称为“real”或“real * 4”。这是一种占用32位(4字节)的二进制格式,其有效位数的精度为24位(约7位小数)。

因此,您的号码实际上并不适合float。您可以改为使用double