2012-05-21 63 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