児玉 です.

From: gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro)
Subject: [ruby-math:00266] Re: Infinity(was Polynomial.rb and floating point exception)
Date: Thu, 20 Apr 2000 09:03:47 +0900 (JST)
Message-ID: <200004200003.JAA08145 / hanare00.math.sci.hokudai.ac.jp>

> In message "[ruby-math:00265] Re: Infinity(was Polynomial.rb and floating point exception)"
>     on 00/04/20, "K.Kodama" <kdm / kobe-kosen.ac.jp> writes:
> >[問い] 不定値との比較 <=> や
> >       ∞<=>∞ の扱いはどうしましょうか?
> >      -1,0,1 を返すっていうのは, 結構つらいものがあります.
> 
> この件はむかしえぐちさん議論しましたね…確か NaN を返すのが
> 良いということになったと思います。

確かに Float の Inf<=>Inf で 0が返るよりも良いかも.

[問い] NaN を返したいときに 
    return 0.0/0.0;
    とかやっても良いのでしょうか?
    OS 依存性の問題とか?

NaN を返すようにすると Float での結果と合わないけど良いですか?
----------
$ ruby -e 'print 0.0/0.0<=>1,"\n"'
/tmp/rba02528:1:in `<=>': comparing NaN (FloatDomainError)
        from /tmp/rba02528:1
$ ruby -e 'print 1.0/0.0<=>1.0/0.0,"\n"'
0
----------

更に云えば, Inifinity=1.0/0.0 と書いた部分で
問題が出たところからこのスレッドが始まっているわけで,
Inf+1 ==> Inf
Inf+Inf ==> Inf
とか, それらしい結果にはなっているし.
Float の Inf や NaN をそのまま転用して良いなら,
特にクラスを作らなくても良いので楽です.

ただ, 区間 [0,∞) とか (-∞,∞) を表すときに
明示的に Float の Inf を使って良いかっていうと,
なんとなく気持悪いような気がしますよね.

> ただ、Mathematica と同じようにInfinity には Directed (実) と 
> Undirected (虚) があるので、必ずしも Comparable とは限らない
> 気がします。複素無限大は<=> を削除した方が良いでしょう。ただ
> 複素無限大は Complex のインスタンスのような気もしますね…

Float, Integer, Rational との計算で,
つじつまが合うのを目標にしています.
Complex の方は ∞を含めてうまく拡張できるかな?
# 需要があるか?


> それとクラス名は InfinityClass より NaNClass とかいうクラス
> にした方がいい気がします。無限大は数でないが、数でないものは
> 無限大とは限らないので。

そうですね.  NaNClass で行きます.

....
> Float の Inf と NaN はどう頑張っても整合しないので、もしやる
> なら IEEE754_NaN IEEE754_Inf といった InfinityClass の定数を
> 持つのがいいと思います。この件はむかし石塚さんと議論したので
> 探してみて下さい。
....
> どちらかと言うと Inf と NaN をまとめ
> ない方が良いような気もします。というか、NaN は計算をとめない
> ために IEEE754 で定義されたプラグマティックな概念なので、整
> 数などに馴染むかどうかは不明です。

Inf, NaN はまとめない事にします.

-- 
K.Kodama(kodama / kobe-kosen.ac.jp)