From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2008-08-19T14:02:44+09:00 Subject: [ruby-dev:35876] Re: Complex & Rational けいじゅ@いしつかです. In the message: "[ruby-dev:35869] Re: Complex & Rational ", on Aug/19 00:22(JST) Tadayoshi Funaba writes: >ruby-dev にメールが届かないので、直接ですみませんが、いくつか確認させて >ください。 ふなばさんのテストメイルは届いていたみたいですが... とりあえず, ruby-dev にもCcを入れてあります. >> ですので, この考えが維持されるなら, 他のものになってもかまいません. >> 例えば, 後でで出てくる, scalar?(とかreal?) でも実現可能ですね. > >一応公開されているので。それで、実際には、generic? は、CMath (Math) の >あたりでしかつかわれおらず、言われるように、scalar? で置き換えることで >よいと思います。 この件にしては, ハイなんですが... generic?が使われていないとのことなので... ソースを見ると, 以下のようになっていますが, static VALUE nucomp_add(VALUE self, VALUE other) { switch (TYPE(other)) { case T_FIXNUM: case T_BIGNUM: case T_FLOAT: case T_RATIONAL: { get_dat1(self); return f_complex_new2(CLASS_OF(self), f_add(dat->real, other), dat->image); } case T_COMPLEX: { VALUE real, image; get_dat2(self, other); real = f_add(adat->real, bdat->real); image = f_add(adat->image, bdat->image); return f_complex_new2(CLASS_OF(self), real, image); } default: return rb_num_coerce_bin(self, other, '+'); } こうでなくて, T_FIXNUM, T_BIGNUM, T_FLOAT, T_RATIONAL だけにかぎらず, other が real?(scalar?) だったら, return f_complex_new2(CLASS_OF(self), f_add(dat->real, other), dat->image); できると言いたいわけなんですよ. >> >{Complex,Rational}#inspect の書式を変更したい。 > >前者ということは、to_s と同じでよいということですか。確認したいのです >が、 いえ, 括弧つきでってことです. to_sは再帰的に呼ばれることはあまりないで すし, あっても, 呼び出す側が考えればよいことですが, inspect は再帰的に 呼ばれるのが前提なので, オブジェクトの境界は明確になって欲しいです. >Rational(1,1).to_s #=> "1" >Rational(1,2).to_s #=> "1/2" > >のように、Rational を見る限り to_s では表現が正規化されています。元になっ >た、nurat では、inspect で "(1/1)"、"(1/2)" としていました。 > >Complex について正規化はされていませんが、そのようにすべきならば > >Complex(1).to_s #=> "1" >Complex(0,1).to_s #=> "i" >Complex(3,1).to_s #=> "3+i" > >のようなこともあり得るでしょう。 そうか, 一貫性がなかったんですね... >一見して区別するためには、to_s、inspect ともに正規化しないか、あるいは、 >少なくとも inspect では正規化しないようにせねばならないように思います。 >どちらが望ましいでしょうか。 両者とも正規化しない方がよい気がしてきました. to_sで "1" が返ると整数 の1と勘違いしそうですものね. >つぎに、 > >Complex(Rational(1,3),Rational(1,3)).to_s #=> "1/3+(1/3)i" > >となっているのですが、たとえば、MIT Scheme などいくつかの Scheme 処理系 >などの結果と比べて思うのは、虚部が有理数の場合の括弧は必要なのか、とい >うことです。inspect の事を考えていたら、かなり微妙な感じに思えてきまし >た。 わざわざこうやっているんですよね. 1/3i だと 1/(3i) に見えるなと思った んです. それに, (1/3)i ≠ 1/(3i) = -(1/3)i ですし... まあ, ただ, それは数式としての話で, Ruby上の表記としてこうなっ ているとすれば問題ない気もします. 他の処理系で一般的ならそれほどこだわ りません. -- (A) >仮に inspect は正規化されず、括弧でくくられるものだとして、 > >Complex(Rational(1,3),Rational(1,3)).inspect > #=> "(1/3+1/3i)" > とか > #=> "((1/3)+(1/3)i)" > >のような感じになるのでしょうか。to_s との違いがかなり微妙です。 > >つけるならつける、つけないならつけないで、 > >Complex(Rational(1,3),Rational(1,3)).to_s #=> "1/3+1/3i" >Complex(Rational(1,3),Rational(1,3)).inspect #=> "((1/3)+(1/3)i)" > >というわけにはいかないでしょうか。 表現的には一貫性がありますよね. あとは, 上記(A)の話だけですが, scheme 以外ってどうなっているんでしょうかね... scheme は 1/3+1/3i って atom で元々各個つけられないですし... こうであ るべきと考えたのか, これしか表現のしようがなかったのか判断できないです し... mathematica は 1i --- 3 見たいな感じですね. これはこれですごーく納得ですが, かなり特別扱いしな いといけないですしねぇ. __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---