2017-12-26 5 views
2

forループが5回実行され、コードを読むときに "計算された"のではない理由がわかりません。なぜfor-loopが5回で4回でないのかわからない

float a; 
int i = 0; 
for(a = 0.01; a < 100; a *= 10) 
    i++; 
cout << i << endl; 

私の考え: 第四は、aの値を実行した後ループのための100のよう がcout << iの出力を与え、100(a < 100)より小さいない「ブレーク」する必要があることで、100です4でなければなりません。

しかしループが5回ではなく4回を実行し、 100 < 100a < 100)を通過して、第5回実行した後 aが1000に等しく、ない100

+2

"科学者が浮動小数点について知っておくべきこと"を読んでください。しかし基本的に、浮動小数点数は、基数の累乗でスケーリングされた小数部として表されます(数値システムの基数)。つまり、限られた値の集合しか表現できません。たとえば、ほとんどすべての現代のコンピュータでは、基数2を使用しているため、浮動小数点値として表現することはできません。 –

+0

このような問題が発生すると、インデックス変数(a)を出力して何が起こるかを確認するのに役立ちます。他の言われているように、おそらく浮動小数点精度の問題です。 – Radu

+2

'cout << a << endl;'をループに追加すると、問題が見えます。 –

答えて

12

.01 * 10^4があるので、それは私のために理にかなっていません100しかし、浮動小数点精度のためにあなたはおそらく99.999324234またはそれに類するもので終わるでしょう。これは、2進数から小数への変換によるものです。

この説明は役立ちます。

+0

これで解決します。 ありがとう、ちょうど私の一日を作った。 – CriticalException

+0

@CriticalException upvoteして受け入れるのを助けた場合。 –

+0

私は2分で、stackoverflowの時間制限のためにします。 – CriticalException

関連する問題