えぐち@エスアンドイー です。

>>> In message [ruby-math:00055] Re: NaN again
    On Tue, 18 Jan 2000 03:06:51 +0900 (JST), gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) said:

ご> ごとけんです
ご> 
ご> In message "[ruby-math:00054] NaN again"
ご>     on 00/01/18, "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> writes:
ご> 
ご> >WindowsNT+VC++6.0(using _isnan())で以下のように
ご> >なりました。
ご> >'?'はちょっと変かなと思うところですがいかがでしょう?
ご> 
ご> そう言えば、こういう調査をしてませんでした。

∞, NaN と ±0 についての調査は必要性を感じますね。

ご> >p a = 1.0
ご> >p b = 0.0/0.0 # 1.0/0.0  -1.0/0.0
ご> >#           a = 1.0 b = Inf -Inf NaN (N:NaN T:True F:False 0:ぜろ)
ご> 
ご> >p a/b    #               0.0  0.0  N
ご> 
ご> IEEE754的には a/-Inf は -0.0 じゃないとダメですね。

これは計算結果を間違えるだけでなく、+0/-0 を正しく表示出来るかも問題です。
fl000118.rb でも "%+.1f" を使っていますが、libc の printf() が、
-0.0 を "+0.000000" と表示するバグを多くの処理系が持っていますので、

--- fl000118.rb	Tue Jan 18 10:16:33 2000
+++ fl000118a.rb	Tue Jan 18 10:28:14 2000
@@ -18,8 +18,10 @@
 	    "+"
 	  elsif 0 > y
 	    "-"
-	  else
-	    "%+.1f" % y
+	  elsif 0.0 == y
+	    1.0 / y > 0.0 ? "+0.0" : "-0.0"
+	  else 
+	    "???"
 	  end
 	when FalseClass
 	  "F"

とする必要があります。

ご> >p a<b    #                T    F   T?
ご> >p b<a    #                F    T   T?
ご> >p a<=b   #                T    F   T?
ご> >p b<=a   #                F    T   T?
ご> 
ご> IEEE754的にはこれらのNaNとの比較については例外を無効演算例外
ご> を発生しなければならないことになっていて結果は定義されていな
ご> いのでなんともいえません。難しい問題ですが直観的には全部、偽
ご> を返すのが自然に思えます。また、その点を考慮して2つの数が比
ご> 較不能の関係にあること調べる演算unorderedの実装が推奨されて
ご> います。

NaN との比較は難物ですね、
わたしも現状の仕様である、「NaN との比較は偽」が自然だと思います。

ご> また、libm の関数も必ずしもIEEE754に準拠してなくて、たとえば
ご> sqrt(-0.0) は -0.0 を返さないといけないことになってますが、
ご> 少なくともFreeBSDの libm はそうなってません。

これも printf() の問題でないですか>

% uname -rms
FreeBSD 3.4-STABLE i386

% cat sqrt.c 
#include <stdio.h>
#include <math.h>
#include <floatingpoint.h>

main()
{
  double d = sqrt(-0.0);

  fpsetmask (fpgetmask() & ~(FP_X_DZ|FP_X_INV|FP_X_OFL));
  printf ("%+f\n", d);
  printf (1.0 / d  < 0.0 ? "-0.0\n" : "+0.0\n");
}
% gcc sqrt.c -O9 -g -lm
% ./a.out 
+0.000000
-0.0


ご> ># BigFloat にInfやNaNをいれようとしています(未完)。
ご> ># これは、Floatに合わそうと思います。
ご> 
ご> 合わせるということの意味は上のテストの結果と揃えるという意味
ご> ですか?? なんとなく Inf はそれではいけないような気がするんで
ご> すが。ただどうあるべきかはよく分かりません。

BigFloat と Float に同等のテストを行った場合の結果の一致は、
誰もが期待する事だと思いますが、``Inf'' のテスト結果と言うのが
前述の±0の問題であるのなら、ruby の printf で対策するのが
妥当だと思います。(あと本来なら、printf(3) にも、、)

	えぐち