けいじゅ@日本ラショナルソフトウェアです. In [ruby-math :00543 ] the message: "[ruby-math:00543] complex.rb problems ", on Aug/12 17:59(JST) masa / stars.gsfc.nasa.gov writes: >田中です。 >complex.rb に少し問題と思われる点があるので、以下のような修正を >提案します。最後にパッチをつけます。ruby-dev に流そうかとも思い >ましたが、内容が ruby-math 寄りなので、こっちに流します。 >1. Fixnum#**の再定義取消と、Float#**の再定義追加 >complex.rb で Fixnum#** が再定義されているのですが、その結果 > > (-2)**2 #=> Complex(4, 0) > >となってしまいます。負の整数の冪乗を Complex として計算するよう >ですが、整数の整数乗は整数または整数分の1となり、複素数とはなら >ないので、complex.rb では Fixnum#** の再定義をしないほうがよいと >思いますがいかがでしょう。 >代わりに Float#** を再定義し、self<0 かつ 冪指数が Integer でな >いときに Complex として計算することを提案します。そうすれば、 >Fixnum#** でも冪指数が Float なら coerce されるので、 > > (-2)**0.5 #=> Complex(8.659560562e-17, 1.414213562) > >となります。 > >ただしこれだけでは Bignum#** が違う動作になります。Bignum#** は、 >冪指数が Float のとき、自前で Float に変換するので、再定義した >Float#** を使いません。そのため、 > > (-10000000000)**0.5 #=> NaN > >となってしまいます。Bignum#** も Fixnum#** のように coerce に任 >せてはどうでしょうか。 うーん. 現状の動作に近いものとしては、こっちのほうがよいと感じますが... その前に, 議論したいことが... Rubyでは int op int -> int にすると言う方針があると思いますが, ** に関しては成立していませんね. い まは, 2 ** (-2) -> 0.25 となっていますが、0 にすべきだと思うようになりました. つぎに, 今のComplexは(新提案のも)堂々と動作を変更していますが, それはよ くないとおもうようになりました. 私の案は. 1. 2 ** (-2) -> 0 に仕様変更 2. Bignum#** も Fixnum#** のように coerce を使うようにする 3. complexでは, IntegerやFloatなどの**を再定義しなくする 4. 田中さんの新提案は mathn に導入する いかがでしょう? >2. Math.sqrt(z) の修正 > >complex.rb で Math.sqrt(z) も再定義されていますが、z が Complex >のとき、 > > z**Rational(1,2) > >と計算しています。これは rational.rb を require していないと >エラーになりますし、しかも多くの場合この結果は有理数ではありません。 >下のパッチでは Float の Complex として計算するように修正しています。 現行のは 結局, Complex#** が呼ばれているんですね. で, 中では極座標を用い て計算していると... 何で今のようになっているのかよく覚えていませんが, きっ と, mathnがcomplexやrationalから十分分離されていないころの名残りかと思い ます. こちらは田中さんの案にしましょう. >3. imag > >imaginary part の略語として image というのは違和感があるので、^^;; > alias imag image >とさせてもらえるとありがたいです。 うーん... なるほど. では, @image -> @imag に変更 過去の互換性のため alias image imag にしましょうか? __ ..............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju / rational.com <<---