2012-12-17 312 views
1
int i = 0; 
double n = 1.24; 
    for (; int(n) != n; i++) { 
     n *= 10; 
    } 

爲什麼它會進入無限循環?它不應該停止兩個循環後?無限循環

+3

這並不編譯,'i'沒有對不起任何地方 – jozefg

+0

宣佈,我馬上糾正它。 – fpiro07

回答

9

1.24不能完全表示爲double。如果檢查的n初始值,你會看到,它是1.239999999999999991118215802998747...

至於爲何循環永遠不會停止,一旦n超過最大double的值,則自動轉換爲+Infinity,這是一個特殊的浮點值。一旦你達到了這一點,n停止改變,int(n) != n永遠不會滿足。

+0

但是如果'n'爲'0.5',爲什麼它能工作? – fpiro07

+3

@ fpiro07因爲'0.5' *可以準確表示('0.5 == 2^-1') –

+0

但調試器實際上說''n'是'1.24',而不是'1.239999999 ...' – fpiro07

1

我已經試過了,並且在兩個循環之後停止。我用過gcc。 我改變INT(N)至(INT)N

無限循環發生,由於一些舍入誤差,嘗試檢查之間(INT)的區別n和n

在一般情況下,不也同樣使用用double來檢查相等性。改用

如果(晶圓廠(AB)< 1E-10)//代替== b

+0

我似乎可以通過使用'long double'來重現問題:http://ideone.com/UrSxGc –

+0

'1e-10'等於'numeric_limits :: epsilon()'?或者,放置'epsilon'會更好嗎? – fpiro07

+0

您可以使用任意小數值(最好使用#define定義)。它應該大於numeric_limits :: epsilon(),因爲錯誤會在計算中傳播。有關詳細信息,請參閱數值分析 – Khalefa