こんにちは、鶴谷です。 [メールアドレス保護] さん>
> 続けまして小野です。 > FreeBSD/i386 7.0Rを導入して試してみましたが、同様の問 > 題は残存しています。やはり拡張倍精度の変数への代入部分のアセ > ンブラコードはオプションの違いによって異なっていますね。数値は6.2 > の場合と同じです。gccは4.2.1 20070719になっている > のですが。 うちでもこうでした: FreeBSD 7.0, gcc 4.2.1 : NG FreeBSD 6.3, gcc 3.4.6 : NG FreeBSD 6.3, gcc 4.2.4 : NG cygwin, gcc 3.4.4 : OK Debian, gcc 3.2.3 : OK おそらくは、 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17778 が原因でgccにこんなコードが挿入されたのだと思うのですが、 私には、どういう問題なのか、また、どうするべきなのか、理解できていません。 試しに、FreeBSD 6.3で、ports/lang/gcc42に、 --- gcc/config/i386/freebsd.h.orig 2007-09-02 00:28:30.000000000 +0900 +++ gcc/config/i386/freebsd.h 2008-06-16 09:09:00.000000000 +0900 @@ -137,4 +137,4 @@ /* FreeBSD sets the rounding precision of the FPU to 53 bits. Let the compiler get the contents of <float.h> and std::numeric_limits correct. */ #undef TARGET_96_ROUND_53_LONG_DOUBLE -#define TARGET_96_ROUND_53_LONG_DOUBLE (!TARGET_64BIT) +#define TARGET_96_ROUND_53_LONG_DOUBLE 0 のようなパッチを当ててビルドして使ってみると、 -m96bit-long-doubleと-m128bit-long-doubleの出力の違いはなくなりました。 しかし、よくわからない問題が残っています。 上述のバグレポートで提示されているテストコードをビルドした結果を見ると、 ほかのOSでの結果と異なります。 Debian : -m96bit-long-doubleなどのオプションがあっても無くても、 0xc.90fdaa22168c4p-2 0xc.90fdaa22168c4p-2 FreeBSD : -m96bit-long-doubleなどのオプションがあっても無くても、 0xc.90fdaa22168c4p-2 0xc.90fdaa22168cp-2 cygwinでは、"%La"が動きませんでした。 そこで、出力時の変換指定子をを"%40.30Lf"として実行すると、 Debian : 3.141592653589793338042568393575 3.141592653589793338042568393575 cygwin : 3.141592653589793338042568393575 3.141592653589793338042568393575 FreeBSD 6.3 : 3.141592653589793115997963468544 3.141592653589793115997963468544 FreeBSD 6.3 (上記の修正を行ったgcc42): 3.141592653589793338042568393575 3.141592653589793115997963468544 となりました... FreeBSDでは、浮動小数点演算はlong doubleで行ってくれないということでしょうか? -- 鶴谷 直樹 E-mail: [メールアドレス保護]