2017-02-27 12 views
4

私は試験でこのコードを見ました:問題はこの文字列が何回印刷されるかです。この文字列は何回印刷されますか?

私はまずそれが10倍になると思ったが、これは間違っている。 誰かが私の答えが間違っている理由を教えてもらえますか? これはC言語のコードの一部です。

浮動小数点値は、限られた分解能を有する:

for (float x = 100000001.0f; x <= 100000010.0f; x += 1.0f) { 
    printf("lbc"); 
} 
+5

非常に関連する質問:http://stackoverflow.com/questions/588004/is-floating-point-math-broken –

+3

適切な答えを出すには 'x'の型を知る必要があります。 – mch

+0

まだ、これはforであり、xに値を追加するので、xは100000010.0fより大きい値になります。 forは終わるでしょう。 –

答えて

6

仮定xは32ビット浮動小数点です。 1000000011*10^8なので、最後に1つを失うことになります。 1つを追加すると、次のfloat値が1.00000008*10^8であるため、再び失われます。あなたは結果が常に同じであるように多くの1を追加することができます。

これがコードが無限ループである理由です。

5
float x = 100000001.0f; 

100000000ある最も近い表現float、とxを初期化します。この値に1を加えると、同じ値になります。あなたがループ内でxの値を印刷する場合

何が起こるか見ます:http://ideone.com/3FJGTz