GCC 4.6.1とVisual Studio(2008 & 2012)またはOSXのClang 7.3.0との間で予期しない(そして不正確な)不等式の比較が発生することがわかりました。コンパイラの最適化による偽浮動の不等式?
ここで減少抜粋です:
typedef float ftype;
struct Foo
{
ftype v;
Foo(): v(16.0f/60.0f) {}
ftype val() const {return v * 60.0f;}
};
void bar()
{
Foo f;
ftype v = f.val();
if (v != f.val())
printf("inequal");
}
FTYPEがdoubleとしてtypedefされている場合、問題は発生しませんが。これはコンパイラのインライン展開と関係がありますか?おそらく実際には浮動小数点の代わりに二重を返すでしょうか?
関連:http://stackoverflow.com/questions/29335982/floating-point-computation-changes-if-stored-in-intermediate-double-variable –
私はこれが浮動小数点数学壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)または[中間二重変数に格納されている場合は浮動小数点計算の変更](http://stackoverflow.com/questions/ 29335982 /中間浮動小数点変数に格納される浮動小数点演算の変更。この場合、正確に同じ関数を2回呼び出して、関数の戻り値の型とまったく同じ型の変数に格納しますが、それでもequal *をそれ自身と比較しません*。 –
これは重複していないことに同意します。関係する式と値はまったく同じで、型昇格のない浮動小数点のみであり、同じ結果が得られるはずです。 – doug