int i = 0;
double n = 1.24;
for (; int(n) != n; i++) {
n *= 10;
}
なぜ無限ループに入るのですか?2回ループしたら止まらない?
int i = 0;
double n = 1.24;
for (; int(n) != n; i++) {
n *= 10;
}
なぜ無限ループに入るのですか?2回ループしたら止まらない?
1.24
として正確に表すことはできませんdouble
。の初期値を調べるとn
、1.239999999999999991118215802998747...
なぜループが止まらないのかというと、一度n
最大の の値を超えると、特殊な浮動小数点値である にdouble
自動的に変換されます。+Infinity
そこに到達すると、n
変化が止まり、int(n) != n
決して満足することはできません。
double は数値の正確な表現ではないため、条件 int(n) == n に到達することはありません。これを読んでください http://en.wikipedia.org/wiki/Floating_point
私はそれを試しましたが、2回ループした後に停止します。私はgccを使用しました。int(n) を (int)n に変更しました
丸め誤差が原因で無限ループが発生します。(int)n と n の違いを確認してください。
一般に、 double との等価性をチェックするために equal を使用しないでください。代わりに使用
if (fabs(ab)<1e-10) //a==b の代わりに