こんにちは、鶴谷です。

[メールアドレス保護] さん>

>  続けまして小野です。
>  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: 
[&#x30E1;&#x30FC;&#x30EB;&#x30A2;&#x30C9;&#x30EC;&#x30B9;&#x4FDD;&#x8B77;]

メールによる返信