けいじゅ@日本ラショナルソフトウェアです.

In [ruby-list :07050 ] the message: "[ruby-list:7050] Re: infinity ",
on Mar/10 15:22(JST) Kazuhisa YANAGAWA writes:

>> 実数のBignumってBigなFloatのことですよね?
>
>  出してから正確な表現を思い出しました. 実数の抽象クラス.... というか, 
>  「実数」というクラスです.

ああ. なるほど. あればあれで気分は良いですよね.

>  こうつながってくる, と. 「不定な計算結果を与える演算は全て例外をあげ
>  る」でもモデルとしては問題ないわけで.

確かにそういうモデルもありですね. 

  0/0 , 0.0/0.0

は例外が上がりますしね.

>  # IEEE の浮動小数点数表現では正負の無限大, 正負の 0, 非数字(NaN)が
>  # 規定されているから, 「Float が IEEE の浮動小数点数表現である」のな
>  # ら Float の定数として存在すべきだろう, という話.

rubyでは定数としてはないんですが, 結果としてInfやNanになることがあるん
ですね. ただ, 表記がおかしいんでどうにかして欲しいですが...

例:

rbc0> _**2
1.0e+168
rbc0> _**2
Inf.0
rbc0> inf = _
Inf.0
rbc0> 0/inf
0.0
rbc0> inf+1
Inf.0
rbc0> inf-inf
NaN.0
rbc0> -inf                          
-Inf.0
rbc0> inf > inf
false
rbc0> inf == inf
true
rbc0> inf > 1
true
rbc0> inf < 0
false
rbc0> Math.sin(inf)
NaN.0
rbc0> Math.exp(inf)
NaN.0
rbc0> nan = _
NaN.0
rbc0> nan == nan
false
rbc0> nan > 0
false

とすれば今のままで, 表現をちゃんとした対応を行なった方が良さそうですね.

# Math.exp(inf)以外はちゃんとした結果になっているところがこわい...

>> 無限大/無限小はある意味で精度が無限にあるわけですから, Floatとは別クラ
>> スにした方が良いと思うのですが...
>
>  で, こっちが Real クラスでも用意して.... という話の方になるわけです.
>  無限大を表すクラスを作るとしても, やっぱりこちらのサブクラスになるで
>  しょう.

そうですね. RealがあるならRealが良いですが, きっとRealは採用されること
はないでしょう(^^;;;

>  # 複素数の大小関係や, 無限大/無限小なぞ考えたくないし. ましてや 

#うーん. 極座標表現で(∞, θ)って感じかなあ... それか, 複素数は,
# Z U {∞} でコンパクト化してしまって無限を1つにしちゃうか, でもそれだ
# と, Realとの互換性がとれないか...

>> あ, でも, Floatの表現できる範囲を越えると無限大/小になってしまうんでし
>> たよね? そうすると精度が無限にあるわけではないくて, Floatとしての無
>> 限大なんですね...

>  こちらはあくまでも IEEE にこだわった場合ですよね.

>  # たぶん Float で表現できる範囲を超えても無限大/無限小になることはな
>  # いと思いますが. オーバフローするだけですね

そうですね. オーバフローした状態がInfなんですね.

結論としては, Floatの定数とした方が良いかなって思うようになりました.

やはり, Infは数学的な無限大とは違うからです. FloatがReal(実数)じゃない
のと同じ理屈です. 

>  学会に出席して提案者に会うたびに「お前の方法はどこかで採用されたのか」
>  とか, 「やっぱり採用されないだろう, こっちの方が優れているんだ」とか
>  いじめられる, とも言ってました (^^;

どんな提案をされていたのでしょう?

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---