-m64 を使用して 64 ビット用にビルドすると、正しい結果が得られますが、32 ビット用にビルドすると、非常に一貫性のない動作が発生します。
たとえば、64 ビットの場合
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.fffffffffffffp+511
sqrt(0x1.fffffffffffffp+1023);// => 0x1.fffffffffffffp+511
(mpfrで検証された、正しく丸められた結果であると私は信じています)
ただし、32 ビットの同じ入力値では、動作が異なります。
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.0p+512
sqrt(0x1.fffffffffffffp+1023); // => 0x1.fffffffffffffp+511
同じ値が変数に渡されると、間違った結果が得られます。各呼び出しの前後に丸めモードを確認しましたが、すべてが最も近いものに丸めるように設定されています。理由は?私は 64 ビット マシンで gcc 4.6 を使用しています。オプションはx86-mfpmath=sse
と-march=pentium
x64 の両方の場合です。