2016-04-15 70 views
-1

我試圖在總結一些數字的循環,但如我所料將這些數字在for循環中

float sum = 0; 
int i; 

printf("0.1+0.1=%f\n", 0.1 + 0.1); 

for (i = 0; i<1000000; i++) 
{ 
    sum = sum + 0.1; 

} 
printf("the sum need to be 100000 \n"); 
printf("the real sum is:\n %f\n", sum); 


system("PAUSE"); 

這個程序打印也沒有去:

0.1 + 0.1 = 0.200000

總和必須設爲100000

真正的總和:

100958.343750

按任意鍵繼續。 。 。

你能解釋一下這個奇怪的結果嗎?

+1

不要擔心:幾乎每個開發者都會陷入這個陷阱。您確實需要了解[浮點數](https://en.wikipedia.org/wiki/Floating_point)在計算機中的工作方式。重要的部分是浮點數不能_exactly_表示大多數數字,你總會有錯誤。就你而言,小錯誤加起來直到它們變大。 – DarkDust

+0

非常感謝你真的幫了我 –

回答

0

浮點數的國際標準沒有一些十進制數的精確表示。

http://en.wikipedia.org/wiki/IEEE_754

這是由於它們被存儲在內存的方式,一路尾數和指數存儲。

https://en.wikipedia.org/wiki/Floating_point

這也是爲什麼即使他們看起來「相同的」你永遠不應該比較兩個浮點數的原因。

我還記得我是第一次有多驚訝一個比較兩個浮點數的簡單代碼沒有工作:)這僅僅會打開一個專門的討論範圍。這是非常值得一讀反正:

http://floating-point-gui.de/errors/comparison/

0

浮動號碼存儲在存儲器中作爲x*2^y其中x是與一些精度0和1之間且y是整數,所以他們準確並不代表最號碼,他們代表數字「足夠接近」。

當您多次執行此添加操作時,錯誤會更加明顯。 您可以使用double類型以獲得更好的準確性。