From: Shin-ichiro HARA Date: 2008-04-21T19:56:18+09:00 Subject: [ruby-dev:34474] Re: ComplexFloat 原です。 > 堀之内です。 > >>> muraken:~/src/ruby$ ./miniruby -e 'p Complex(1, Rational(1, 2)) / 2' >>> Complex(0, Rational(1, 4)) >> この例は Complex がコンテナであるという問題点を良く指摘していると >> 思います。 > > 実部虚部は、整数、有理数、浮動小数点数の場合がありえるけど、実部 > と虚部の型が合うように常に揃える(合うように coerce する)という > のはどうでしょう。初期化時も演算時も。(これは、ComplexFloat を > 別途導入することはしないという案です。) > > 実部虚部ばらばらのコンテナである気持悪さがなくなりますし、 > 下記ででてきた > >>> 実部と虚部が共に整数であるような複素数をガウス整数と呼ぶそうです。 >>> また、実部と虚部が共に有理数だとガウス有理数と呼ぶそうです。 > > も表現できます。というか、ガウス整数、ガウス有理数、実数の拡張と > しての普通の複素数を浮動小数点近似したもの、の3種類をサポートす > るということになります。 なるほど。複素数の生成時に実部と虚部の和を取っていると考えると、coerce が起動されたりしてもおかしくはない。操作する度に型のチェックが入って忙 しい気がしますが、それほど問題じゃないかな。 >>   x == y かつ x.class = y.class だが、x と y の振る舞いが違う > > は、残ってしまいますが、3者を判別するメソッドでもあれば良いので > はないでしょうか。複素数を使うというのは、やはり少々特殊ですので、 > 妥協できそうに思いますが。 問題としては、数体系の拡張に備えて「3者」以外のことも考える必要があるか もしれないことですね。うーん、良く考えないとわからないけど、アリかも。