[#40961] [Bug #3137] complex.rb changes exceptions of Math — Yusuke Endoh <redmine@...>

Bug #3137: complex.rb changes exceptions of Math

15 messages 2010/04/12
[#40967] Re: [Bug #3137] complex.rb changes exceptions of Math — keiju@... (石塚圭樹) 2010/04/13

けいじゅ@いしつかです.

[#41038] Windows と DL が使用条件の libffi — Aaron Patterson <aaron.patterson@...>

こんにちは!アーロンです。

17 messages 2010/04/22
[#41039] Re: Windows と DL が使用条件の libffi — "U.Nakamura" <usa@...> 2010/04/22

こんにちは、なかむら(う)です。

[#41040] Re: Windows と DL が使用条件の libffi — "NARUSE, Yui" <naruse@...> 2010/04/22

成瀬です。

[#41059] Re: Windows と DL が使用条件の libffi — Aaron Patterson <aaron.patterson@...> 2010/04/26

2010/4/21 NARUSE, Yui <naruse@airemix.jp>:

[#41060] Re: Windows と DL が使用条件の libffi — Yugui <yugui@...> 2010/04/26

2010/4/26 Aaron Patterson <aaron.patterson@gmail.com>:

[#41067] [Feature #3203] LazySweepGC patch — Narihiro Nakamura <redmine@...>

Feature #3203: LazySweepGC patch

15 messages 2010/04/26
[#41069] Re: [Feature #3203] LazySweepGC patch — Yusuke ENDOH <mame@...> 2010/04/27

遠藤です。

[#41104] Rails3 M17N — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

29 messages 2010/04/30
[#41111] Re: Rails3 M17N — Urabe Shyouhei <shyouhei@...> 2010/04/30

Yukihiro Matsumoto =E3=81=95=E3=82=93=E3=81=AF=E6=9B=B8=E3=81=8D=E3=81=BE=

[#41113] Re: Rails3 M17N — Yukihiro Matsumoto <matz@...> 2010/04/30

まつもと ゆきひろです

[ruby-dev:40961] [Bug #3137] complex.rb changes exceptions of Math

From: Yusuke Endoh <redmine@...>
Date: 2010-04-12 14:01:41 UTC
List: ruby-dev #40961
Bug #3137: complex.rb changes exceptions of Math
http://redmine.ruby-lang.org/issues/show/3137

起票者: Yusuke Endoh
ステータス: Open, 優先度: Normal
担当者: Keiju Ishitsuka, カテゴリ: lib, Target version: 1.9.2
ruby -v: ruby 1.9.2dev (2010-04-12 trunk 27317) [i686-linux]

いしつかさん
遠藤です。

[ruby-core:28204] にて Brian Ford が「complex を require すると
Math.atan(nil) で投げられる例外が変わる」という報告をしています。


  $ ./ruby -e 'p Math.atanh(nil)'
  -e:1:in `atanh': can't convert nil into Float (TypeError)
          from -e:1:in `<main>'

  $ ./ruby -rcomplex -e 'p Math.atanh(nil)'
  /home/mame/work/ruby-trunk-local/lib/ruby/1.9.1/cmath.rb:196:in `atanh': undefined method `real?' for nil:NilClass (NoMethodError)
          from -e:1:in `<main>'


Ruby レベルのライブラリは duck typing のためにむやみに型チェック
すべきでないとはいえ、CMath は組み込みの Math クラスの置き換えを
前提としているので、なるべく Math クラスの挙動を尊重した方がよい
と思いました。

以下のパッチをコミットしてもいいでしょうか。

# ついでですが、[ruby-dev:40953] も見てください。


diff --git a/lib/cmath.rb b/lib/cmath.rb
index b23dac2..aa2d9bb 100644
--- a/lib/cmath.rb
+++ b/lib/cmath.rb
@@ -27,6 +27,7 @@ module CMath
   alias atanh! atanh
 
   def exp(z)
+    z = Float(z)
     if z.real?
       exp!(z)
     else
@@ -36,9 +37,9 @@ module CMath
     end
   end
 
-  def log(*args)
-    z, b = args
-    if z.real? and z >= 0 and (b.nil? or b >= 0)
+  def log(z, b = nil)
+    z = Float(z)
+    if z.real? and z >= 0 and (b.nil? or (b = Float(b); b >= 0))
       log!(*args)
     else
       a = Complex(log!(z.abs), z.arg)
@@ -50,6 +51,7 @@ module CMath
   end
 
   def log2(z)
+    z = Float(z)
     if z.real? and z >= 0
       log2!(z)
     else
@@ -58,6 +60,7 @@ module CMath
   end
 
   def log10(z)
+    z = Float(z)
     if z.real? and z >= 0
       log10!(z)
     else
@@ -66,6 +69,7 @@ module CMath
   end
 
   def sqrt(z)
+    z = Float(z)
     if z.real?
       if z < 0
 	Complex(0, sqrt!(-z))
@@ -85,6 +89,7 @@ module CMath
   end
 
   def cbrt(z)
+    z = Float(z)
     if z.real? and z >= 0
       cbrt!(z)
     else
@@ -93,6 +98,7 @@ module CMath
   end
 
   def sin(z)
+    z = Float(z)
     if z.real?
       sin!(z)
     else
@@ -102,6 +108,7 @@ module CMath
   end
 
   def cos(z)
+    z = Float(z)
     if z.real?
       cos!(z)
     else
@@ -111,6 +118,7 @@ module CMath
   end
 
   def tan(z)
+    z = Float(z)
     if z.real?
       tan!(z)
     else
@@ -119,6 +127,7 @@ module CMath
   end
 
   def sinh(z)
+    z = Float(z)
     if z.real?
       sinh!(z)
     else
@@ -128,6 +137,7 @@ module CMath
   end
 
   def cosh(z)
+    z = Float(z)
     if z.real?
       cosh!(z)
     else
@@ -137,6 +147,7 @@ module CMath
   end
 
   def tanh(z)
+    z = Float(z)
     if z.real?
       tanh!(z)
     else
@@ -145,6 +156,7 @@ module CMath
   end
 
   def asin(z)
+    z = Float(z)
     if z.real? and z >= -1 and z <= 1
       asin!(z)
     else
@@ -153,6 +165,7 @@ module CMath
   end
 
   def acos(z)
+    z = Float(z)
     if z.real? and z >= -1 and z <= 1
       acos!(z)
     else
@@ -161,6 +174,7 @@ module CMath
   end
 
   def atan(z)
+    z = Float(z)
     if z.real?
       atan!(z)
     else
@@ -169,6 +183,7 @@ module CMath
   end
 
   def atan2(y,x)
+    x, y = Float(x), Float(y)
     if y.real? and x.real?
       atan2!(y,x)
     else
@@ -177,6 +192,7 @@ module CMath
   end
 
   def asinh(z)
+    z = Float(z)
     if z.real?
       asinh!(z)
     else
@@ -185,6 +201,7 @@ module CMath
   end
 
   def acosh(z)
+    z = Float(z)
     if z.real? and z >= 1
       acosh!(z)
     else
@@ -193,6 +210,7 @@ module CMath
   end
 
   def atanh(z)
+    z = Float(z)
     if z.real? and z >= -1 and z <= 1
       atanh!(z)
     else

-- 
Yusuke Endoh <mame@tsg.ne.jp>


----------------------------------------
http://redmine.ruby-lang.org

In This Thread

Prev Next