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

ruby-changes:7898

From: mame <ko1@a...>
Date: Thu, 18 Sep 2008 22:51:37 +0900 (JST)
Subject: [ruby-changes:7898] Ruby:r19419 (trunk): * ext/bigdecimal/bigdecimal.c (VpCtoV): 1E1000...000 is interpreted as

mame	2008-09-18 22:48:21 +0900 (Thu, 18 Sep 2008)

  New Revision: 19419

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

  Log:
    * ext/bigdecimal/bigdecimal.c (VpCtoV): 1E1000...000 is interpreted as
      Infinity.  [ruby-dev:36159]
    
    * ext/bigdecimal/bigdecimal.c (VpPower): Infinity ** 1 returns
      Infinity instead of NaN.  [ruby-dev:36159]
    
    * test/bigdecimal/test_bigdecimal.rb: add tests for above.

  Modified files:
    trunk/ChangeLog
    trunk/ext/bigdecimal/bigdecimal.c
    trunk/test/bigdecimal/test_bigdecimal.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 19418)
+++ ChangeLog	(revision 19419)
@@ -1,3 +1,13 @@
+Thu Sep 18 22:35:03 2008  Yusuke Endoh  <mame@t...>
+
+	* ext/bigdecimal/bigdecimal.c (VpCtoV): 1E1000...000 is interpreted as
+	  Infinity.  [ruby-dev:36159]
+
+	* ext/bigdecimal/bigdecimal.c (VpPower): Infinity ** 1 returns
+	  Infinity instead of NaN.  [ruby-dev:36159]
+
+	* test/bigdecimal/test_bigdecimal.rb: add tests for above.
+
 Thu Sep 18 21:57:32 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* string.c (rb_str_comparable): make ascii8bit string to be
Index: ext/bigdecimal/bigdecimal.c
===================================================================
--- ext/bigdecimal/bigdecimal.c	(revision 19418)
+++ ext/bigdecimal/bigdecimal.c	(revision 19419)
@@ -3944,7 +3944,12 @@
             es = e*((S_INT)BASE_FIG);
             e = e * 10 + exp_chr[i] - '0';
             if(es>e*((S_INT)BASE_FIG)) {
-                return VpException(VP_EXCEPTION_INFINITY,"exponent overflow",0);
+                VpException(VP_EXCEPTION_INFINITY,"exponent overflow",0);
+                sign = 1;
+                if(int_chr[0] == '-') sign = -1;
+                if(signe > 0) VpSetInf(a, sign);
+                else VpSetZero(a, sign);
+                return 1;
             }
             ++i;
         }
@@ -4633,10 +4638,22 @@
         }
         goto Exit;
     }
-    if(!VpIsDef(x)) {
-        VpSetNaN(y); /* Not sure !!! */
+    if(VpIsNaN(x)) {
+        VpSetNaN(y);
         goto Exit;
     }
+    if(VpIsInf(x)) {
+        if(n==0) {
+            VpSetOne(y);
+            goto Exit;
+        }
+        if(n>0) {
+            VpSetInf(y, (n%2==0 || VpIsPosInf(x)) ? 1 : -1);
+            goto Exit;
+        }
+        VpSetZero(y, (n%2==0 || VpIsPosInf(x)) ? 1 : -1);
+        goto Exit;
+    }
 
     if((x->exponent == 1) &&(x->Prec == 1) &&(x->frac[0] == 1)) {
         /* abs(x) = 1 */
Index: test/bigdecimal/test_bigdecimal.rb
===================================================================
--- test/bigdecimal/test_bigdecimal.rb	(revision 19418)
+++ test/bigdecimal/test_bigdecimal.rb	(revision 19419)
@@ -595,7 +595,18 @@
     assert_equal(BigDecimal.new("-Infinity"), BigDecimal.new("-0") ** -1)
     BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
     assert_equal(true, (BigDecimal.new("NaN") ** 1).nan?)
-    assert_equal(true, (BigDecimal.new("Infinity") ** 1).nan?) # OK?
+
+    assert_equal(BigDecimal::SIGN_POSITIVE_INFINITE, (BigDecimal.new("Infinity") ** 2).sign)
+    assert_equal(BigDecimal::SIGN_POSITIVE_INFINITE, (BigDecimal.new("Infinity") ** 1).sign)
+    assert_equal(1, BigDecimal.new("Infinity") ** 0)
+    assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("Infinity") ** -1).sign)
+    assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("Infinity") ** -2).sign)
+
+    assert_equal(BigDecimal::SIGN_POSITIVE_INFINITE, (BigDecimal.new("-Infinity") ** 2).sign)
+    assert_equal(BigDecimal::SIGN_NEGATIVE_INFINITE, (BigDecimal.new("-Infinity") ** 1).sign)
+    assert_equal(1, BigDecimal.new("-Infinity") ** 0)
+    assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, (BigDecimal.new("-Infinity") ** -1).sign)
+    assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, (BigDecimal.new("-Infinity") ** -2).sign)
   end
 
   def test_limit
@@ -676,6 +687,10 @@
     assert_equal(10, BigDecimal.new("1E+1"))
     assert_equal(1, BigDecimal.new("+1"))
     BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
-    assert_equal(0, BigDecimal.new("1E1" + "0" * 100)) # OK? must it be inf?
+
+    assert_equal(BigDecimal::SIGN_POSITIVE_INFINITE, BigDecimal.new("1E1" + "0" * 10000).sign)
+    assert_equal(BigDecimal::SIGN_NEGATIVE_INFINITE, BigDecimal.new("-1E1" + "0" * 10000).sign)
+    assert_equal(BigDecimal::SIGN_POSITIVE_ZERO, BigDecimal.new("1E-1" + "0" * 10000).sign)
+    assert_equal(BigDecimal::SIGN_NEGATIVE_ZERO, BigDecimal.new("-1E-1" + "0" * 10000).sign)
   end
 end

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

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