私は試験でこのコードを見ました:問題はこの文字列が何回印刷されるかです。この文字列は何回印刷されますか?
私はまずそれが10倍になると思ったが、これは間違っている。 誰かが私の答えが間違っている理由を教えてもらえますか? これはC言語のコードの一部です。
浮動小数点値は、限られた分解能を有する:
for (float x = 100000001.0f; x <= 100000010.0f; x += 1.0f) {
printf("lbc");
}
私は試験でこのコードを見ました:問題はこの文字列が何回印刷されるかです。この文字列は何回印刷されますか?
私はまずそれが10倍になると思ったが、これは間違っている。 誰かが私の答えが間違っている理由を教えてもらえますか? これはC言語のコードの一部です。
浮動小数点値は、限られた分解能を有する:
for (float x = 100000001.0f; x <= 100000010.0f; x += 1.0f) {
printf("lbc");
}
仮定xは32ビット浮動小数点です。 100000001
は1*10^8
なので、最後に1つを失うことになります。 1つを追加すると、次のfloat値が1.00000008*10^8
であるため、再び失われます。あなたは結果が常に同じであるように多くの1
を追加することができます。
これがコードが無限ループである理由です。
float x = 100000001.0f;
は100000000
ある最も近い表現float
、とx
を初期化します。この値に1
を加えると、同じ値になります。あなたがループ内でx
の値を印刷する場合
何が起こるか見ます:http://ideone.com/3FJGTz
非常に関連する質問:http://stackoverflow.com/questions/588004/is-floating-point-math-broken –
適切な答えを出すには 'x'の型を知る必要があります。 – mch
まだ、これはforであり、xに値を追加するので、xは100000010.0fより大きい値になります。 forは終わるでしょう。 –