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

>>> In message [ruby-math:00057] Re: NaN again
    On Tue, 18 Jan 2000 11:54:47 +0900, "Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> said:

小林> 小林@会社です。
小林> 
小林> ----- Original Message ----- 
小林> 送信者 : GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp>
小林> 件名 : [ruby-math:00055] Re: NaN again
小林>  
小林> > >p b<=>a  #               1   -1   0?  (should be NaN?)
小林> > >p a<=>b  #              -1    1   0?  (should be NaN?)
小林> > 
小林> > 手元ではちゃんと FloatDomainError になります
小林> >
小林> ありゃ?
小林> たぶん、またコンパイラーの差ですね。帰ったら調べてみます。
小林> ただ、ここだけ FloatDomainError になるのも妙な気がします。

1.0 <=> NaN  が 0.0 と言うのは ary#sort の場合などで問題ですね。

ここで、FloatDomainError となるのは、IEEE754 に <=> がない(^^)
と言う理由の他に、{ -1, 0, +1 } 以外の何を返せば良いかと言う点で
妥当な値がないと言うのも大きな理由です。

 Date: Sun, 8 Aug 1999 04:17:30 +0900
 From: EGUCHI Osamu <eguchi / shizuokanet.ne.jp>
 Reply-To: ruby-dev / netlab.co.jp
 Subject: [ruby-dev:7558] NaN#<=>

から始まるスレッドで現在の ruby の実装に至っています。

個人的には、 1.0 - NaN = NaN なので、NaN が良いと思います。
ちなみに、NaN#<=> の結果が NaN であっても ary#sort は、
<=> が整数以外を返すと例外を挙げて止まるので問題ないです。

小林> > >p a==b   #                F    F   T?
小林> > >p b==a   #                F    F   T?
小林> > >p a!=b   #                T    T   F?
小林> > >p b!=a   #                T    T   F?
小林> > 
小林> > この4つの NaN との比較は間違っています。
小林> > 
小林> 「比較するのが間違い」、「比較の結果が間違い」
小林> のどちらでしょうか?

a=1.0 b=NaN の場合の一致は false が正しいでしょう。
問題は、 != が Fortran で言う .NE. なのか .LG. なのか
と言う点で、結果の値は同じですが、例外が発生する/しない
の差異があります。

ここで言う例外は Ruby の例外ではなく、IEEE754 の例外です。
IEEE754 では、例外のディフォルトの動作は何もしない事、
とあるので、現状では Float に IEEE754 の例外の挙動を
変更する仕組みがないので、!= か <> かに差異はありません。

小林> > >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の実装が推奨されて
小林> > います。

例外のディフォルトの挙動が「なにもしない」なので、
IEEE754 の無効演算例外が発生する事と、結果の定義とは対立しませんでした。
この場合は全て false が正しいようです。
#ruby の Float はコンパイラのコード生成やライブラリを尊重するので
#VC で ruby をコンパイルすると Float は無茶苦茶ですね (@@)l

小林> こここそ FloatDomainError になるほうがよい気がします。
小林> (ただ、以下に記述しましたように、仕方がないような気もします)

Ruby の例外は継続出来ないので、NaN との比較演算の全てを
例外として扱うと、途中の結果が NaN になった後の計算が、
ニッチモサッチモ行かなくなる可能性があります。

	えぐち