From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2010-04-13T16:30:38+09:00 Subject: [ruby-dev:40969] Re: [Bug #3137] complex.rb changes exceptions of Math けいじゅ@いしつかです. In [ruby-dev:40968] the message: "[ruby-dev:40968] Re: [Bug #3137] complex.rb changes exceptions of Math", on Apr/13 15:19(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|ただ, Complex#atanh等で, >|> -e:1:in `atanh': can't convert nil into Float (TypeError) >|という例外はふさわしくない気もします. Complex#atanhの実装を知らないと >|わけの分からないエラーになっている気がしません? >そう? nil渡して「nilじゃダメ」と言われてるんだから明確でな >いかと。「Floatでなくてもいいじゃん」ってことなんだと思うけ >ど、そこは致命的ではないのでは。 実装案を見ると: def exp(z) begin if z.real? exp!(z) else ere = exp!(z.real) Complex(ere * cos!(z.imag), ere * sin!(z.imag)) end rescue NoMethodError => exp if exp.name == :real? raise "error" end raise end end こんな感じです. "error"のところの例外をどうするかって話で, ここで >|> -e:1:in `atanh': can't convert nil into Float (TypeError) ちょっと分かりづらい例外かとおもったんですね. あと, def exp(z) begin if z.real? exp!(z) else ere = exp!(z.real) Complex(ere * cos!(z.imag), ere * sin!(z.imag)) end rescue NoMethodError => exp if exp.name == :real? return exp(Float(z)) end raise end end はあるかなぁ... Numericとそのサブクラスしか, real? って持ってませんの で, それ以外のクラスはMathと同じ振る舞いということで, Floatに変換して 試すはありかも. これだと, CMathの担当範囲外はMathと同じ結果になります. ちょっと, くどい気がしなくもありませんが... __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---