From: Shin-ichiro HARA Date: 2008-03-27T17:12:29+09:00 Subject: [ruby-dev:34154] Re: rational.rb, complex.rb and mathn.rb 原です。 >> (1) (-8)**Rational(1,2) は複素数1.0+1.7320508*i >> (2) Math.sqrt(-8) は、例外発生 >> >> でどうでしょうか。(2) の理由は「伝統の維持」です。(1) は、互換性がない >> のだけど、多分使っている人は少ないからまあいいか、ということです。 >> やっぱり難しいなあ。 > > やはりちぐはぐな感じがしますね。 > > ruby では、同じ数値を Rational でも Complex でも表現でき、また、関数形 > 式、メソッド形式、演算子間で違いがあって、さらに mathn もあって、あちこ > ち分断されているように感じます。 「同じ数値を Rational でも Complex でも表現でき」というところにふなばさ んの考えがよくあらわれていると思います。対比して極端に言うと「Rational や Complex に違う数があって、相互に変換ができたりできなかったりする。そ れでいい。」というのが私の感覚かな。話がふりだしに戻りそうだけど。 しかし、Complex はやっかいです。だって、そもそも Real が作れないのに Complex が作れるなんて変ですよね。現在の Complex は、ちょっとコンテナ型 というか、Float 成分の Complex だったり、Integer 成分の Complex とかす るわけで、単純なものとは言い難いですね。しかたがないのですが。 で、現場に戻ると… > この案を採用したとして、 > > Math.sqrt(Rational(1,4)) #=> Rational(1, 2) > Math.sqrt(4) #=> 2 > > のようなことをしたい場合、どういう対応になるんでしょうね。 私は、Math.sqrt の戻り値は Float 固定と考えています。そいう厳密数を返す 関数は isqrt とかいう名前で別に用意するわけです。ruby-math で実装につい てだいぶ議論したけど、結局本体に取り込むに至りませんでした。私がヘタレ のせいかも。