2017-01-24 16 views
1

float値を比較すると予期せぬ動作が起こりますが、浮動小数点では問題が四捨五入される可能性がありますが、浮動小数点値を比較すると予期せぬ動作が発生する

#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; 
} 

実際には、α= 1.0fのときに条件が入ります。その動作を理解できません...

私はMinGW(GCC 5.3.0)をWindows 10(32ビットと64ビットでテスト済み)、Intel i5プロセッサでコンパイルしています。

+3

'printf("%。7f \ n "、alpha);')のように '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マークprintのデフォルトの書式が若干大きいことを丸めている

1.0fより、1.0fに戻ります。

要するに、これは、一般に正確な10進表現を持たないバイナリ浮動小数点によるものです。

+0

私はOPは重複を研究するように勧められますが、私は同意しません。浮動小数点の知識で武装していても、この特殊なケースについて説明するのは良いことです。 (価値があるものについては、おそらく2〜3の浮動小数点質問を、あなたが1週間に特定したものと重複して閉じてしまうでしょう。) – Bathsheba

関連する問題