正木です。

|田中です。

|complex.rb に少し問題と思われる点があるので、以下のような修正を
|提案します。最後にパッチをつけます。ruby-dev に流そうかとも思い
|ましたが、内容が ruby-math 寄りなので、こっちに流します。

自分で再定義して対処していましたが、これは(充分検討したうえで)是非
採用して欲しいと思います。
特に image は違和感が強いので、 alias でなく最初から改めて欲しい。
(image を選んだ積極的な意味があるのなら別ですが。)

|    z**Rational(1,2)
|
|と計算しています。これは rational.rb を require していないと
|エラーになりますし、しかも多くの場合この結果は有理数ではありません。

Ruby では標準で Rational が使えるようにしておいたら如何でしょう?


他に一寸気付いたところでは Math.sqrt でもっと単純に

if z.imag < 0
  sqrt(z.conjugate).conjugate
else
  r,x=z.abs,z.real
  Complex(sqrt!((r+x)/2),sqrt!((r-x)/2))
end

位では駄目ですか? FPU の sqrt は充分早いと思うので。
うろ覚えですが fsqrt の clock 数は除算にくらべてもそれほどは
違わなかったような気がします。


以下は 5/2==2 はおかしいという話の補足です。
もしある人が平方数に対しては
sqrt(n**2)=|n| (n :Integer)
となるべきだと思って、そのように再定義し、同じ理由で
class Complex  
  def abs
    Math.sqrt(abs2)
  end
end
と変えたとすると、そのとたんに上記の program に気付きにくい bug が発生します。
(Complex(4,3).abs=5 (Fixnum)
となり
sqrt(Complex(4,3)) が正しい値を返しません。)
この場合 5/2==2 という仕様を忘れた方が悪いのか、それともその仕様が
間違っているのか、どちらでしょうか?
FORTRAN や C のように a/2 の代わりに 
0.5*a
とか
a/2.0 
と書かないといけないような仕様は、洗練された仕様とは思えません。
Ruby の場合は 再定義するか mathn.rb を使えば上記の問題は解決するので、
その点が FORTRAN や C と違ってすばらしいところです。