2012-05-21 27 views
3

当我运行下面的程序:不一致求和

#include <stdio.h> 
#include <math.h> 

int main() 
{ 
    double sum, increase; 
    long amount, j; 

    printf("sum = "); 
    scanf("%lf", &sum); 
    printf("increase = "); 
    scanf("%lf", &increase); 
    printf("amount = "); 
    scanf("%ld", &amount); 

    for (j = 1; j <= amount; j++) 
    { 
     sum += increase; 
    } 

    printf("%lf\n", sum); 

    return 0; 
} 

我获得这些值以下响应:

MacBook:c benjamin$ ./test 
sum = 234.4 
increase = 0.000001 
amount = 198038851 
432.438851 
MacBook:c benjamin$ ./test 
sum = 234.4 
increase = 0.000001 
amount = 198038852 
432.438851 
MacBook:c benjamin$ ./test 
sum = 234.4 
increase = 0.000001 
amount = 198038853 
432.438852 

这里,我通过1中的每个增加变量“量”案件。

  • 在第一个,总结给我所期望的。
  • 在第二个,它惊人地给出了相同的价值。
  • 第三,继续总结。

这是为什么发生?

虽然代码似乎不是很有用,但我刚刚写了有问题的部分。我其实想在更大的程序中使用它。

谢谢!

+0

你忘了实际的问题吗? – Malvolio

+6

浮点数的精确度有限,而且我会在某个地方发现足够的精度,导致数量相同。 – Corbin

+3

每个计算机科学家都应该知道的关于浮点运算的问题 - http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – epatel

回答

3

这是格式问题,而不是数字。如果更改printf

printf("%.12lf\n", sum); 

结果看起来沿着你所预期的线条更:

sum = increase = amount = 432.438851000198 
sum = increase = amount = 432.438852000198 
sum = increase = amount = 432.438853000198 

“垃圾”的结尾是由于浮点数的精度有限。

+0

这是您在ideone [\ [link \]](http://ideone.com/oyJ3G)稍作修改的程序。 – dasblinkenlight