2017-01-01 16 views
6

現在、私はJavaの浮動小数点数を学習中です。フロートには特定の量の重要な数字があることはわかっています。浮動小数点数は-1または1 * num * 10^xのようにjavaで表されることも知っています。ここで、numはnumerであり、10^xは小数点である "point"です。しかし、ここでは数字の一部しか持っていません。ここで無限ループはどのように可能ですか?Java Infinite whileループ - 浮動123456789

無限ループとコード:これは、浮動小数点演算についてです

float f = 123456789; 
while (f-- > 0) { 
System.out.println(f); 
} 
+1

ループは無限大ですか? fが0になった後はどうなりますか? –

+0

fは同じで、デクリメントはありません。それは無限ループです。去年の大学での試験問題でした(例試験)。 – thomas

+0

fはこの数値を表すのに十分正確ではありません(f--)が解決策ですが、なぜですか? – thomas

答えて

4

。番号f = 1.23456792E8を通過したときの状況に遭遇した番号を減らすと、f-1fは同じ浮動小数点表現を持つため、すべてが間違っています。したがって、デクリメントすると数字がそれ自体になり、無限ループにつながります。ちょうど確認してください:

System.out.println(1.23456792E8f); 
System.out.println(1.23456792E8f - 1); 

何が特別なのですか?なぜ実行がそこで終わるのですか? 123456789の浮動小数点表現は1.23456792E8です。すでに浮動小数点数の精度が不足しているため、これは少なくとも3のギャップを与えています。 floatの代わりにdoubleを使用すると、プログラムは終了しますが、問題はより高い番号で発生します。

+0

あなたは何ですかすべてを破壊するという意味ですか? –

+0

アルゴリズム - ありがとう、私はそれを変更する –

+0

なぜそれは0.23456792E8ではない? – thomas