From: Shin-ichiro HARA Date: 2008-05-10T09:30:41+09:00 Subject: [ruby-dev:34628] Re: ComplexFloat 原です。 > こんばんは sheepman です。 > $ ruby-1.9 -ve 'p 1/(1+Complex::I)' > ruby 1.9.0 (2008-04-24 revision 15721) [i686-linux] > Complex(0, -1) > 選択肢としては、 > > 1. 実部と虚部が整数の複素数の除算は、実部と虚部を Rational に変換してから行う。 > 2. Complex を捨てて ComplexFloat のみ。 > 3. Scheme の exact complex に相当する ComplexRational を導入する。 > 4. complex が常に mathn を require する。 > > があろうかと思います。 石塚さんが [ruby-dev:34603] で、これはバグだと言ってるので、 ナニなんですが、私の説は、 5. Complex はこのままでOK。 です。 この『Complex このままでモーマンタイ理論』は以下の通り。 まず、Ruby に「複素数」というクラスがあるということ自体、不思 議だ。というのは、そもそも Ruby には「実数」というクラスが無 いからだ。 「実数」が無いぐらいだから「複素数」も有るはずが無い。 逆に言えば、整数をラップして / を quo にするような、Complex を作るなら、整数をラップして / を quo にするような、Real をな ぜ作らないのか、ということになる。 ところで、Ruby で、そもそも組み込みで「実数」を表現するインス タンスを持ち得るクラスがあれば良かったのかというとそうではな い。 というのは、「実数」というのは、無限精度を持つ数値なので、 Float さえ演算の挙動を考えれば「実数」と呼ぶべきでないという 説もある。 更に、もともと「実数」は計算機では表現できない。連続体である 実数の集合としての濃度は計算機で表現できる数の集合の濃度より 大きい。 もし「実数」を表現すると称するクラスを持つならば、それは誇大 広告だろう。 そして、Ruby は Integer、Float、Rational を持つが、「実数」を 表現するクラスを持っていない。そこに、自分の出来ることはこれ だけだよ、という率直さ、謙虚さが表れているし、論理的である。 さて、以上の見地からして Ruby に Complex という、インスタンス を持ち得るクラスを組み込みで持つのはどう解釈すればいいか。 突然 Complex が現れても、さっき述べた理由で「複素数」であるは ずがないので、何かの洒落かアイロニーか、あるいは「複素数」を 思わせる何かであるに違いない。そして、定義を見て、確かに複素 数的な四則演算を持つオブジェクトを生成する仕組みだと分かる。 すなわち、関数 Complex() は「複素数」を返すというより、数値の ペアを作りそれなりの四則演算機能を持たせる Complexification (複素化=複素っぽくすること)の略である。クラス Complex は Complexification の受け皿なのである。 そして、多くのユーザーは、Float 成分の Complex を使うだろうし、 そうでないユーザーは、用途に合わせて工夫して Complex を使うだ ろう。 よってこののままでOK。 ... という理論:-)です。