正木です。 |田中です。 |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 と違ってすばらしいところです。