質問: 1.0; (int)f < 10;f+=0.1){ printf("%f ",f); } getchar(); } ``` ここで疑問があります。for文はfor(1;2;3){4}で1→243→243→243の順に実行されますよね。 このforループは f=1.0→(中略)→9.90表示→9.90+0.1=10.0にインクリメント→(次のループへ)→(int)f<10の判定(10<10)→10.0表示→10.0+0.1=10.1にインクリメント→(次のループへ)→(int)f<10の判定→条件に合わずループ抜ける という流れになっていますが、9.90+0.1=10.0にインクリメントした後は(int)fは10になるはずなので(int)f<10の条件をクリアできず10.0を表示出来ないはずです。でも実際には10.0は表示されているので条件はクリアできたことになります。 何が起こっているのかを教えて貰えないでしょうか。
回答: 理解としてはあっていますから大丈夫ですよ。 ソースも正しいと思います。 double型のfが10.0と思われるのにf<10の条件を抜けてしまうのは浮動小数点数型につきものの**誤差**が原因だと思います。 こちらのページが分かりやすいです。 double型で計算をしてしまうと、10.0に見えても実際には9.99999999999999999999999何がしだったりになってしまうことがあります。 そうするとint型に変換した時9になってしまいます。 会社かどこかの研修であれば、ちょっと話し合ってみると良いでしょう。 (僕ならこういう問題はそういう話すること前提じゃなきゃ出さないです)