どういうわけか、私はこのプログラムを実行すると、私が10に達したときに停止する方法で書きましたが、それは永遠に続きます。forループは永遠に続きます
double i;
for(i = 0; i != 10; i+= 0.1){
printf("%.1f\n", i);
}
どういうわけか、私はこのプログラムを実行すると、私が10に達したときに停止する方法で書きましたが、それは永遠に続きます。forループは永遠に続きます
double i;
for(i = 0; i != 10; i+= 0.1){
printf("%.1f\n", i);
}
0.1は、double
として正確に表現することはできません。
ループの状態をi < 10
に変更するのが簡単です。
それ以外の場合は、整数型、固定精度浮動小数点数などのループ変数を使用します。
ただし、他の10進数の増分、特に2の負の倍数(0.5、0.25など)では、反復回数がそれほど高くならない場合は、動作する可能性があることに注意してください。
1/10の部分が2進数で表現できないのは、小数で表されます。永久にバイナリリピートで1/10:0.000110011001100110011 ....これは、10進数の0.1が2進数のシステムで正確な表現を持たないことを意味します。 – cdhowie
「i」に小数点以下を入力して、何が起こっているかを確認します。 – molbdnilo
条件 "i <= 10.0"を適用すると問題が解決されます... –
"条件を適用してfoo"をなぜ説明しなくてもひどい答えです。少しだけ良いコメントです。 – Donnie