From: Tanaka Akira Date: 2008-04-23T19:23:26+09:00 Subject: [ruby-dev:34496] Re: ComplexFloat Complex と ComplexFloat とクラスをふたつに分ける理由がどうに もわかりません。 In article <480AE086.9070107@blade.nagaokaut.ac.jp>, Shin-ichiro HARA writes: > それは、ComplexFloat の方が扱いやすく、利用する人も多いだろうと思われる > からです。 たとえば、Complex(r,i) が中身が Float の Complex を生成し、 中身が Float でない Complex を生成するには Complex.new を使 うというのはどうでしょうか。 仮にそうしたとすれば、Complex() を使って生成する限り、一貫し て Float な Complex を使うことが出来ます。ComplexFloat とい う長い名前を使う必要もありませんし、そっちのほうが使いやすい んじゃないでしょうか。 ここで、ComplexFloat と、中身が Float の Complex の挙動が等 しいと想定しています。もし挙動が異なるんでしたらそう指摘して ください。 > むらたさんの提案と私の提案にはずれがあり、私自身の提案も変遷しているの > で、分かりにくいかもしれません。私の提案は、実装の事も気にしていますが、 > 基本的には仕様を問題にしています。ふなばさんは、Complex がコンテナであ > るということに起因する問題([ruby-dev:34439])に対してどう考えていますか? > > もう一度少し違う例を挙げると、Complex を導入すると > > x.class == y.class かつ x == y だが、x - z != y - z > > となる例があります。x = Complex(0, 1.6), y = Complex(0, Rational(16, 10)), > z = Complex(0, 1) です。 > > 数値 x の振舞いは x の属するクラスで決まって欲しい、そのようなものが組 > み込みではより望ましい、のではないでしょうか? なんでクラスで決まってほしいんでしょう? 上の例は、不正確数のいやらしさが Complex に表れたものであり、 [ruby-dev:34439] は / の挙動のいやらしさが Complex に表れた ものです。たしかに、Complex は中身の性質が表に出てきます。 その性質が簡単に判断できないというのはたしかに問題かもしれま せん。でも、その性質って、クラスで判断することが適切なんでしょ うか? たしかに、ComplexFloat を導入すれば、ComplexFloat が不正確数 であることをクラスで判断できます。 でも、[ruby-dev:34439] の / の問題は解決できません。これをク ラスで判断できるようにするには、ComplexInteger を導入する必 要があるでしょう。 また、不正確数は Float だけではありません。BigDecimal や Decimal を (その表現できる桁を越えた値の近似として) 使えば、 不正確数になります。これをクラスで判断できるようにするには ComplexBigDecimal や ComplexDecimal を導入するんでしょうか。 これは際限がない気がします。 あと、Complex() に Float や Integer が与えられたらどうするの か、という問題もあります。原さんの案だと、ComplexFloat は組 み込みですから、Float が与えられた時に ComplexFloat を生成す るのは可能かもしれません。でも、今はまだない ComplexInteger を誰かが定義した時、Complex() に Integer を与えて Complex オ ブジェクトが生成されるとすれば、中身が Integer では「ない」 ことはクラスでは判断できません。 中身の性質を判断したいという要求は充分にあり得ると思うんです が、それにクラスを用いるという点が納得できません。 正確数か不正確数か判断したいというなら、 Scheme の exact?, inexact? あたりを取り入れて、 Numeric#exact?, Numeric#inexact? を提案するほうがいいと思う んですが、なんでクラスを使いたいんでしょう? -- [田中 哲][たなか あきら][Tanaka Akira]