From: Masahiro TANAKA Date: 2003-07-26T19:11:07+09:00 Subject: [ruby-dev:20920] Re: complex.rb At Sat, 26 Jul 2003 06:52:21 +0900, 石塚圭樹 wrote: > まず, > > >|** の再定義を削除する他に、以下の変更も含みます。 > > この件ですが, いつかはチャンとした形で再定義したいと思っていますので, > それはご了承下さい. 了解です。 > > * Complex.new の引数が Complex であったときに例外を上げる > > Complex.new(a,b) = Complex(a, n) => a + bi > > のつもりですので, 引数がComplexでもかまわないと思います. 一応, > Rationalも同じ考えになっています. しかし、現状では Complex.new の引数をそのまま実部・虚部にしているので、 Complex( Complex(1,1), 1 ) みたいな、実部 and/or 虚部が複素数というへんてこりんな数ができてしまい ます。一方 Complex(a,b) メソッドはそのことが考慮されているのですが、 まだ完全ではありません。引数が複素数の場合もきちんと取り扱うコードを 入れるまでは、暫定的にでも例外を上げておいた方がよいと思います。 > > * Math.atan2 の再定義の削除 > > できていないですからね... できれば, 考えてもらえれば(^^;;; atan2 は実数のみの関数だと今日まで思っていたのですが、 mathematica のドキュメントを見たら定義が載っていました。 以下追加パッチです。 田中昌宏 --- lib/complex.rb.fix 2003-07-25 19:17:54 +0900 +++ lib/complex.rb 2003-07-26 18:19:46 +0900 @@ -22,7 +22,7 @@ # The following +Math+ module methods are redefined to handle Complex arguments. # They will work as normal with non-Complex arguments. # sqrt exp cos sin tan log log10 -# cosh sinh tanh acos asin atan acosh asinh atanh +# cosh sinh tanh acos asin atan atan2 acosh asinh atanh # @@ -238,7 +238,7 @@ # Argument (angle from (1,0) on the complex plane). # def arg - Math.atan2(@image.to_f, @real.to_f) + Math.atan2!(@image, @real) end alias angle arg @@ -432,6 +432,7 @@ alias acos! acos alias asin! asin alias atan! atan + alias atan2! atan2 alias acosh! acosh alias asinh! asinh alias atanh! atanh @@ -560,6 +561,14 @@ end end + def atan2(y,x) + if Complex.generic?(y) and Complex.generic?(x) + atan2!(y,x) + else + -1.0.im * log( (x+1.0.im*y) / sqrt(x*x+y*y) ) + end + end + def acosh(z) if Complex.generic?(z) acosh!(z) @@ -610,6 +619,8 @@ module_function :asin module_function :atan! module_function :atan + module_function :atan2! + module_function :atan2 module_function :acosh! module_function :acosh module_function :asinh!