1
int i = 0;
double n = 1.24;
    for (; int(n) != n; i++) {
        n *= 10;
    }

なぜ無限ループに入るのですか?2回ループしたら止まらない?

4

3 に答える 3

9

1.24として正確に表すことはできませんdouble。の初期値を調べるとn1.239999999999999991118215802998747...

なぜループが止まらないのかというと、一度n最大の の値を超えると、特殊な浮動小数点値である にdouble自動的に変換されます。+Infinityそこに到達すると、n変化が止まり、int(n) != n決して満足することはできません。

于 2012-12-17T12:59:01.130 に答える
4

double は数値の正確な表現ではないため、条件 int(n) == n に到達することはありません。これを読んでください http://en.wikipedia.org/wiki/Floating_point

于 2012-12-17T12:58:38.043 に答える
1

私はそれを試しましたが、2回ループした後に停止します。私はgccを使用しました。int(n) を (int)n に変更しました

丸め誤差が原因で無限ループが発生します。(int)n と n の違いを確認してください。

一般に、 double との等価性をチェックするために equal を使用しないでください。代わりに使用

if (fabs(ab)<1e-10) //a==b の代わりに

于 2012-12-17T13:03:02.347 に答える