けいじゅ@日本ラショナルソフトウェアです. 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 <<---