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/