木村です.

> 鶴谷さん [FreeBSD-users-jp 91686] Re: long double の bug ? について
> うちでもこうでした:
> 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
  系統的に御検討いただき,ありがとうございます.FreeBSD は
大変なことになっていますね.

> FreeBSDでは、浮動小数点演算はlong doubleで行ってくれないということでしょうか?
  96bit を前提にしても,そうではないのです.状況を補足致します.

木村 [FreeBSD-users-jp 91680]
> 2. 原因
>   この問題の生じ方を探りますと,「FreeBSD 6.2 において拡張倍
> 精度として 96bit を使うと,式の中の定数の精度が double に
> 落とされてしまう」ことに起因していることが分かりました.
>
>  例えば,こんな使い方をした場合です.
>   x = 3.14159265358979323846L;
>   x = sqrtl(1.5L);

  ちゃんと書かなかったのがいけないのですが,精度が落ちるのは
「定数のみ」であって,「変数」や「演算」ではないのです.例えば,

   static char *d = "3.14159265358979323846L";
   sscanf(d,"%Lf",&x);  

とすれば,x の値は 128bit にて x = 3.14159265358979323846L; と
代入したのと同じ値になります.また演算も,fpsetprec(FP_PE); を
実行した後で,実行文の右辺に定数を使わずに,すなわち定数を
上記のように sscanf() を使って全て変数に「置き換え」,
(1) 変数のみの演算
(2) 変数による関数の呼び出し
(3) 変数と関数との演算
のいずれかで構成すれば,128bitと同じ結果が得られます.
  私が試した限りでは,「定数」のみに関連して生じる問題です.

この点は取り急ぎお伝えしたいので,先ずここまででメール致します.
鶴谷さんのメールの残りの部分への意見や質問は,この後させていた
だきます.

                     Satoshi Kimura  
([メールアドレス保護])

メールによる返信