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

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 <<---