From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2008-05-08T03:40:01+09:00 Subject: [ruby-dev:34603] Re: ComplexFloat けいじゅ@いしつかです. In [ruby-dev :34601 ] the message: "[ruby-dev:34601] Re: ComplexFloat ", on May/07 22:31(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|複素数の除算で問題があります。Scheme では >| (/ 1 1+1i) >|は 1/2 - 1/2i か 0.5 - 0.5i のどちらかです。 >|しかし、 Ruby の Complex では mathn を require しない場合 >|-i になります。 >| >|$ ruby-1.9 -ve 'p 1/(1+Complex::I)' >|ruby 1.9.0 (2008-04-24 revision 15721) [i686-linux] >|Complex(0, -1) >| >|複素数を使う場合に求められる除算の動作は、Scheme のそれのどちらかだと思います。 >|なので、現在の Ruby の Complex の「/ の意味は自身の実部と虚部に任せる」という >|方針は変えるべきだと思います。 > >同意します。 これは. 単にcomplex.c{rb}のバグです. # 正直言って威張れない状況なのですが(^^;;; 原因はquoの導入時にComplecxの方は対応できていなかったってことなんです が, 根本的に/とquoの使い分けが難しいってことがあります. Complex::/の定 義なのにquoを使わなくては行けないって状況になることに気が付きづらいん ですよね. これは, Complex::/は最適化というほどでもないですが, ちょびっ とコード改善がされているのでさらにわかりづらくなっています. >|選択肢としては、 >| >|1. 実部と虚部が整数の複素数の除算は、実部と虚部を Rational に変換してから行う。 >|2. Complex を捨てて ComplexFloat のみ。 >|3. Scheme の exact complex に相当する ComplexRational を導入する。 >|4. complex が常に mathn を require する。 >| >|があろうかと思います。 > >が、どれが正しい選択であるか判断するのは私だけでは困難なので >どなたか意見(or 情報)をいただけませんか? 今回のは, バグといえばバグなんですが... 私としてはあえていいますが, >|4. complex が常に mathn を require する。 であり, かつcomplexが組み込みってことは常に4(/の振る舞いにかんしては) とするってことです. やはり, /とquoの使い分けは結構難しいと思います(そ れなりにわかっている人でさえも). これは, ふなばさんが以前に指摘してい る通り, /に足そうせいが成り立っていないせいで起こっている問題です. プ ログラマに優しくないことはRubyの精神に反しているってことで, 4の方針に 一気に行きましょう!! 4にすると何が起こるかの確認です: 1/1 => 1 1/2 => Rational(1,2) 2/2 => 1 __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---