2017-01-24 37 views
1

當比較浮點值時,我收到了意想不到的行爲,我知道浮點數可能具有舍入精度問題,但這裏的數字對於提出這些問題非常具體。C編碼,比較浮點值時的意外行爲

#include <stdio.h> 
int main() 
{ 
    float alpha = 0.0f; 
    int finish = 0; 

    while (finish == 0) 
    { 
     alpha += 0.05f; 

     if (alpha > 1.0f) 
     { 
      printf("%f", alpha); // Expected result: 1.05f, actual result: 1.0f 
      finish = 1; 
     } 
    } 

    return 0; 
} 

實際上,當alpha = 1.0f時條件進入。無法理解的行爲...

我在Windows 10(在32位和64位測試),Intel i5處理器上與MinGW(GCC 5.3.0)編譯。

+3

如果您要打印含有更多有效數字的'alpha'(例如'printf(「%。7f \ n」,alpha);'),那麼您會立即看到問題:http://ideone.com/zwQW7e 。 –

+1

您必須知道0.05f的常量是否略小或略大於無限比特流,它將完全代表0.05。據推測,它稍大。 –

+0

檢查了這個(這是我用來建立我的答案):http://www.exploringbinary.com/floating-point-converter/ – Bathsheba

回答

2

(限制答案,如果我可能符合IEEE754浮點)。

沒有這樣的float作爲0.05。該最近數表示的到是

0.0500000007450580596923828125

所以發生了什麼,是比你的想法加入到alpha,這足以只是推過來稍微較大的值1.0f mark(出於興趣,可以完全代表)。

print中的默認格式是四捨五入,略大於比1.0f號回到1.0f

總之,這一切都是由於二進制浮點不具有,一般來說,精確的十進制表示。

+0

我不同意,雖然OP會被建議研究重複。即使掌握了浮點知識,對這個特殊情況解釋也不錯。 (對於它的價值,我可能會將2或3個浮點問題重複爲您每週確定的問題。) – Bathsheba