四則演算の最適化

数値解析に関するレポート問題をやっていてはまったポイント。

        double a = sqrt(3.0);
        double b = 2*a;

        double x = 102 * b - 200 * a;
        double y = 102 * b; y -= 200 * a;
        assert(x == y);   // this assertion fails

確認はgcc 3.4.4 (on cygwin)にて。コンパイルオプションに-O0(最適化オフ)をつけてもこうなる。逆アセンブルは気力が無いのでやらないけど、xの計算がごりごりと展開されているのかな。