mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19419 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c3e2e0e53f
commit
e040ff5530
3 changed files with 47 additions and 5 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Thu Sep 18 22:35:03 2008 Yusuke Endoh <mame@tsg.ne.jp>
|
||||
|
||||
* 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@ruby-lang.org>
|
||||
|
||||
* string.c (rb_str_comparable): make ascii8bit string to be
|
||||
|
|
|
@ -3944,7 +3944,12 @@ VpCtoV(Real *a, const char *int_chr, U_LONG ni, const char *frac, U_LONG nf, con
|
|||
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,8 +4638,20 @@ VpPower(Real *y, Real *x, S_INT n)
|
|||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -595,7 +595,18 @@ class TestBigDecimal < Test::Unit::TestCase
|
|||
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 @@ class TestBigDecimal < Test::Unit::TestCase
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue