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

In [ruby-math :00553 ] the message: "[ruby-math:00553] Re: complex.rb
problems ", on Aug/15 14:46(JST) 正木 功 writes:

>正木です。

>|complex.rb に少し問題と思われる点があるので、以下のような修正を
>|提案します。最後にパッチをつけます。ruby-dev に流そうかとも思い
>|ましたが、内容が ruby-math 寄りなので、こっちに流します。
>
>自分で再定義して対処していましたが、これは(充分検討したうえで)是非
>採用して欲しいと思います。

いくつかは採用してよいと思っていますが, 微妙なものもありますし...

>特に image は違和感が強いので、 alias でなく最初から改めて欲しい。
>(image を選んだ積極的な意味があるのなら別ですが。)

別のメイルにもありますが、そのつもりです.

>|    z**Rational(1,2)
>|
>|と計算しています。これは rational.rb を require していないと
>|エラーになりますし、しかも多くの場合この結果は有理数ではありません。
>
>Ruby では標準で Rational が使えるようにしておいたら如何でしょう?

この場合は, 意味もなく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 数は除算にくらべてもそれほどは
>違わなかったような気がします。

なるほど... こっちのほうがよいかなぁ... 

ただ, Math::sqrt は必ず結果は Float としてよいんじゃないかしら? Math系の
メソッドをどうするかとも関わりますけどね...

>以下は 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 という仕様を忘れた方が悪いのか、それともその仕様が
>間違っているのか、どちらでしょうか?

いまのRubyの方針だと, これはバグじゃなくてそのメソッドの仕様なんでしょう
ね. つまり, なるべくしてなっていると... つまり, Matrix#det と同じですね.

やっぱ, Rationalを組み込み(もしくはそれ相当)にすべきだよなぁって, 結論に
なる. 

>FORTRAN や C のように a/2 の代わりに 
>0.5*a
>とか
>a/2.0 
>と書かないといけないような仕様は、洗練された仕様とは思えません。

確に, 書けばそれなりの動作をするけど, 書かなくてもちゃんと動作しないと...

>Ruby の場合は 再定義するか mathn.rb を使えば上記の問題は解決するので、
>その点が FORTRAN や C と違ってすばらしいところです。

(^^;;;

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---