From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2003-07-26T07:47:49+09:00 Subject: [ruby-dev:20907] Re: 0**(-1) with rational けいじゅ@いしつかです. In [ruby-dev:20889] the message: "[ruby-dev:20889] Re: 0**(-1) with rational", on Jul/25 12:49(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|数値系のクラスNum1があって, coerceメカニズムを採用している >|Num1op(other)が定義されている時に, >| num.op2(other) >|して coerceされると, num'.op2(other') が呼ばれますよね? >|これって仕様として相応しいんでしょうか? num1'.op(other')が呼ばれるべき >|だと思うのですが? > >これはバグです。直します。 了解. >|>> % ruby -rrational -e 'p 0**(-1)' >|>> Rational(1, 0) >|>> % ruby -e 'p 0**(-1)' >|>> Infinity >| >|たぶん意図してなかったと思います. バグです. > >どう直すべきですか。1.8.0のリリースが近いので暫定的でも修正 >したいです。石塚さんが忙しいなら方針(or あるべき状態)だけ出 >してくだされば、だれかの協力をお願いできるのではないかと思い >ます。 気が付きましたが, これって, 一概にバグとも言えないでね(^^;;; きっと考 えてこの結果だったんだと思います. というのも, (0**(-1)).class => Float なので, これは違うだろうってことなんだと思います. さらに.... この辺りは, すごく深い問題ですね... というのも, rationalも ですが, 数値系のクラス全体で一貫していないですね. Integer, Float, Ratinal, BigDecimalで, 各々振る舞いが異なっています. 0/0 => DevZero 0.0/0.0 => Nan Ratinal(0)/0 => DevZero BigDecimal.new("0")/0.0 => Nan Complex(0)/0 => DevZero 1/0 => DevZero 1.0/0.0 => Infinity(Floatの) Ratinal(1)/0 => DevZero BigDecimal.new("1")/0.0 => Infinity(BigDecimalの) Complex(1)/0 => DevZero 0**-1 => Infinity(Floatの) 0.0**-1 => Infinity(Floatの) Ratinal(0)**-1 => Rational(1,0) BigDecimal.new("0")**-1 => 0.0 Complex(-1)**0 => Complex(Infinity, Nan) 0**0 => 1 0.0**0 => 1 Rational(0)**0 => Rational(1,1) BigDecimal.new("0")**0 => -0.0 # あと, 何かチェック項目ありましたっけ? 結論としては, Ratinalの振る舞いはIntegerと同じような感じってなりますか... Float系とInteger系(含むRational)は振る舞いが異なっても良いのかもしれま せんが... # どちらにしても, けっこう重そうな話... >|そうなんですよね. この件に関しては, いくらなんでもやりすぎかなと思い, >|デフォルトでは, このような動作はしない方が良いかなと思っていたようで, >|その方向で直そうと思っていたみたいです. > >これも同様。 こちらはとりあえず削除をすれば良いかと... __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---