[前][次][番号順一覧][スレッド一覧]

ruby-changes:12994

From: nobu <ko1@a...>
Date: Wed, 2 Sep 2009 16:50:45 +0900 (JST)
Subject: [ruby-changes:12994] Ruby:r24738 (trunk): * math.c (math_gamma): get rid of direct comparison between too

nobu	2009-09-02 16:50:16 +0900 (Wed, 02 Sep 2009)

  New Revision: 24738

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24738

  Log:
    * math.c (math_gamma): get rid of direct comparison between too
      big double and integer, with gcc on x86_64.  [ruby-core:25257]

  Modified files:
    trunk/ChangeLog
    trunk/math.c
    trunk/test/ruby/test_math.rb

Index: math.c
===================================================================
--- math.c	(revision 24737)
+++ math.c	(revision 24738)
@@ -13,6 +13,8 @@
 #include <math.h>
 #include <errno.h>
 
+#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
+
 VALUE rb_mMath;
 
 extern VALUE rb_to_float(VALUE val);
@@ -663,13 +665,14 @@
     };
     double d0, d;
     double intpart, fracpart;
+    int n;
     Need_Float(x);
     d0 = RFLOAT_VALUE(x);
     fracpart = modf(d0, &intpart);
     if (fracpart == 0.0 &&
-            0 < intpart &&
-            (size_t)intpart <= sizeof(fact_table)/sizeof(*fact_table)) {
-        return DBL2NUM(fact_table[(int)intpart - 1]);
+	0 < intpart &&
+	(n = (int)intpart - 1) < numberof(fact_table)) {
+        return DBL2NUM(fact_table[n]);
     }
     errno = 0;
     d = tgamma(d0);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24737)
+++ ChangeLog	(revision 24738)
@@ -1,3 +1,8 @@
+Wed Sep  2 16:49:53 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* math.c (math_gamma): get rid of direct comparison between too
+	  big double and integer, with gcc on x86_64.  [ruby-core:25257]
+
 Wed Sep  2 13:47:30 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* math.c (domain_check): simplified.
Index: test/ruby/test_math.rb
===================================================================
--- test/ruby/test_math.rb	(revision 24737)
+++ test/ruby/test_math.rb	(revision 24738)
@@ -1,6 +1,10 @@
 require 'test/unit'
 
 class TestMath < Test::Unit::TestCase
+  def assert_infinity(a, *rest)
+    assert(!a.finite?, *rest)
+  end
+
   def check(a, b)
     err = [Float::EPSILON * 4, [a.abs, b.abs].max * Float::EPSILON * 256].max
     assert_in_delta(a, b, err)
@@ -189,6 +193,13 @@
     check(2, Math.gamma(3))
     check(15 * sqrt_pi / 8, Math.gamma(3.5))
     check(6, Math.gamma(4))
+
+    # no SEGV [ruby-core:25257]
+    31.upto(65) do |i|
+      i = 1 << i
+      assert_infinity(Math.gamma(i))
+      assert_infinity(Math.gamma(i-1))
+    end
   end
 
   def test_lgamma

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]