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

>>> In message [ruby-math:00270] Re: Infinity(was Polynomial.rb and floating point exception)
    On Mon, 24 Apr 2000 08:25:16 +0900, "K.Kodama" <kdm / kobe-kosen.ac.jp> said:

> 児玉 です.
> ∞の扱いと超準的な計算のクラスについて.
> 超実数(HyperReal)クラスを試作中.
> # 理論的には面白いけど実用性は???
> 
> From: EGUCHI Osamu <eguchi / shizuokanet.ne.jp>
> Subject: [ruby-math:00268] Re: Infinity(was Polynomial.rb and floating
>  point exception)
> Date: Thu, 20 Apr 2000 10:39:49 +0900
> Message-ID: <20000420103949H.eguchi / shizuokanet.ne.jp>
> ....
> > > >       ∞<=>∞ の扱いはどうしましょうか?
> > > >      -1,0,1 を返すっていうのは, 結構つらいものがあります.
> > > 
> > > この件はむかしえぐちさん議論しましたね…確か NaN を返すのが
> > > 良いということになったと思います。
> > 
> > この時の ∞ は Float::Infinity 的な(IEE754 の)浮動小数点演算での
> > 無限大でしたが、今回の無限大はより数学的な方(Math::Infinity?)で
> > 関連はあるけど別個の問題だと思います。
> 
> 今のところ, 比較で判定出来ない場合は NaN を返しています.
> こうしてしまうと, 通常の Comparable モジュールの動作との
> 整合性が問題になりますが...

比較で判断出来ない時に返った NaN をつかって、比較を行うと
例外がちゃんと挙がるので、これは調子がいいと思います。

かえって、演算がオーバーフローすると黙って Inf に
なってしまう方が、見付かりにくい問題の元になりそうですね。

> > > Float の Inf と NaN はどう頑張っても整合しないので、もしやる
> > > なら IEEE754_NaN IEEE754_Inf といった InfinityClass の定数を
> > > 持つのがいいと思います。この件はむかし石塚さんと議論したので
> > > 探してみて下さい。
> > 
> > NaN が返るような演算は、数学的には無効や不定な場合ですので
> > IEE754 な文脈以外(数学的な文脈)では、基本的に NaN は不要では?
> 
> Float を使ってしまうと,
> 計算途中で IEEE754 的な Inf や NaN が出てしまうので,
> うまく整合性がとれればそのほうが望ましいです.
> が, 完全な調整は思い付かないので,
> 必要な場合に意図的に Inf や NaN を
> InfinityClass の対応する定数に変換します.
> ここまでで,一応, 素朴な Infinity の扱いは完成.
> クラス名は InfinityClass のまま.

どうしても現実の計算機で実現しているので、
IEEE754 に準拠の組み込みの演算機能の
数学的に美しくない部分に触れてしまって厄介ですね。

この種の問題で、IEEE754 は +0.0 と -0.0 を
別個の物だと考えるという動作による問題もあります。

  1.0 / -0.0 ⇒ -Infinity 

、、とか。

> 数学的な文脈で押し通そうとすると,
> 超実数(HyperReal)を定義して
> Epsilon や Infinity を数として計算できるようにしてしまうのが
> 最も根本的な解決のような気がします.
> # 実用的な価値はちょっと疑問.
> 超準的な計算では, 無限小 や ∞ の強さもわかるので
> 無限小/無限小, 無限小*∞, ∞/∞ 等の計算が解釈可能となります.
> ただし真の0(無限小でなく) については,
> 0*∞=0 で, 0/0 や 1/0 は定義されません.
> HyperReal クラスの試作では
> 以下のように計算できるところまで確認しています.

をぉ、確かに根本的な解決!
ちょっと気が早いかも知れませんが、
これが Ruby 標準のライブラリにあると、
けっこうなウリになりますね。 (^^)

	えぐち