2017-04-24 20 views
1

どういうわけか、私はこのプログラムを実行すると、私が10に達したときに停止する方法で書きましたが、それは永遠に続きます。forループは永遠に続きます

double i; 
for(i = 0; i != 10; i+= 0.1){ 
    printf("%.1f\n", i); 
} 
+2

「i」に小数点以下を入力して、何が起こっているかを確認します。 – molbdnilo

+1

条件 "i <= 10.0"を適用すると問題が解決されます... –

+0

"条件を適用してfoo"をなぜ説明しなくてもひどい答えです。少しだけ良いコメントです。 – Donnie

答えて

5

0.1は、doubleとして正確に表現することはできません。

ループの状態をi < 10に変更するのが簡単です。

それ以外の場合は、整数型、固定精度浮動小数点数などのループ変数を使用します。

ただし、他の10進数の増分、特に2の負の倍数(0.5、0.25など)では、反復回数がそれほど高くならない場合は、動作する可能性があることに注意してください。

+1

1/10の部分が2進数で表現できないのは、小数で表されます。永久にバイナリリピートで1/10:0.000110011001100110011 ....これは、10進数の0.1が2進数のシステムで正確な表現を持たないことを意味します。 – cdhowie

関連する問題