0

私はプロジェクタイラーの問題をいじっていますが、次のような非常に奇妙な動作に遭遇しました。そして、私は何が起こっているのかを理解することはできません。

スクリーンショット

スクリーンショットが示すように。条件は false と評価され、if ステートメントは true であるかのように実行されます。

ここで気が狂いそうです。

更新されたコード: http://ideone.com/L7KMu

編集: 条件の直前の next.x および next.y の実際の値は、0.324583、9.97891 です。

if ステートメントの後は変更されません。

4

2 に答える 2

6

コードをコンパイルすると、呼び出している abs は、浮動小数点用にオーバーロードされた std::abs ではなく、整数 abs のようです。コードに次の修正を加えてみてください。

// get the root not relating to this point
nextX = (abs(solved.first - next.x) < EPSILON) ? solved.second : solved.first;
nextY = k * nextX + m;
prev = next;
next = point(nextX, nextY);

cout << abs(next.x) << ", " << std::abs(next.x) << endl;
if ( std::abs(next.x) < 0.01){
    cout << "Here1" << endl;
    if ( next.y > 0){
        cout << "Here2" << endl;
        foundExit = true;
    }
}

cout 行が abs と std::abs に対して異なる値を出力していることに気付くでしょう。

于 2012-07-08T16:49:43.743 に答える
2

abs(next.x) は 0 と 1 の間にあるため、0 として評価されています。この丸めは、使用されているコンパイラに依存します。

于 2012-07-08T16:50:46.163 に答える