正木です。

|From: keiju / ishitsuka.com (石塚圭樹)
|Subject: [ruby-math:00550] Re: complex.rb problems

|うーん. ちょっと違うんじゃないかな? Rubyの演算メカニズムは、
|
|  int op int -> int
|
|同様
|
|  T op T -> T
|
|ってのが基礎にあり、それプラスcoerceメカニズムによる、異タイプ間演算があ
|ります.

私も自然数の 1 ,有理整数の 1,有理数の Rational(1,1),実数の 1,複素数の
Complex(1,0) はそれぞれ違うものだとは思っていますが、実用的にはそれらを
区別する必要は殆んど無く、むしろ

4/2 :Integer
4/3 :Rational
(4/3)/(2/3) :Integer

(3/2)*(2/3) :Integer
Complex(1,1)*Complex(1,-1) :Integer

sqrt(4) :Integer
sqrt(2) :real
sqrt(-1) :complex
Complex(3,4).abs=5 :Integer

2**(-2) :Rational
2**(-1/2) :real
Complex(a,b)**0=1  :Integer

のように、柔軟に対応してくれた方がずっと使いやすいと思います。
T:Numeric と考えれば上の原則にも反していないと思いますが。
異タイプというのは Vector とか Matrix のことでしょう。

但し Float は便宜上のもので、本当の数とは認められないので
(p ((1.0/49)*49==1.0) => false
p (1+1e-16 != 1) => false
p (Math.sqrt(2)**2==2) => false
等の現象のため矛盾の無い体系が作れません。
大体数学的には浮動小数点数などという数はありません。)
これは異タイプとして別扱いにすべきものと思います。


|1. 2 ** (-2) -> 0 に仕様変更

こんな不自然なことを考えないといけないという事自体が、今の仕様に無理が
ある証拠です。