* bigdecimal.c (BigDecimal_coerce): convert a Float to a BigDecimal instead
of converting the receiver to a Float. [ruby-core:58756] [Bug #9192] * test/bigdecimal/test_bigdecimal.rb: add tests for the above change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44073 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
e54e3d70a8
commit
0727a22c69
@ -1,3 +1,11 @@
|
|||||||
|
Sun Dec 8 20:21:00 2013 Kenta Murata <mrkn@mrkn.jp>
|
||||||
|
|
||||||
|
* bigdecimal.c (BigDecimal_coerce): convert a Float to a BigDecimal instead
|
||||||
|
of converting the receiver to a Float.
|
||||||
|
[ruby-core:58756] [Bug #9192]
|
||||||
|
|
||||||
|
* test/bigdecimal/test_bigdecimal.rb: add tests for the above change.
|
||||||
|
|
||||||
Sun Dec 8 18:28:20 2013 Kazuki Tsujimoto <kazuki@callcc.net>
|
Sun Dec 8 18:28:20 2013 Kazuki Tsujimoto <kazuki@callcc.net>
|
||||||
|
|
||||||
* NEWS: [DOC] update NEWS about GC.
|
* NEWS: [DOC] update NEWS about GC.
|
||||||
|
@ -797,7 +797,8 @@ BigDecimal_coerce(VALUE self, VALUE other)
|
|||||||
Real *b;
|
Real *b;
|
||||||
|
|
||||||
if (RB_TYPE_P(other, T_FLOAT)) {
|
if (RB_TYPE_P(other, T_FLOAT)) {
|
||||||
obj = rb_assoc_new(other, BigDecimal_to_f(self));
|
GUARD_OBJ(b, GetVpValueWithPrec(other, DBL_DIG+1, 1));
|
||||||
|
obj = rb_assoc_new(ToValue(b), self);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (RB_TYPE_P(other, T_RATIONAL)) {
|
if (RB_TYPE_P(other, T_RATIONAL)) {
|
||||||
|
@ -438,6 +438,20 @@ class TestBigDecimal < Test::Unit::TestCase
|
|||||||
assert_equal(0, BigDecimal("1E-1") <=> 10**(-1), '#4825')
|
assert_equal(0, BigDecimal("1E-1") <=> 10**(-1), '#4825')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_cmp_issue9192
|
||||||
|
bug9192 = '[ruby-core:58756] [#9192]'
|
||||||
|
operators = { :== => :==, :< => :>, :> => :<, :<= => :>=, :>= => :<= }
|
||||||
|
5.upto(8) do |i|
|
||||||
|
s = "706.0#{i}"
|
||||||
|
d = BigDecimal(s)
|
||||||
|
f = s.to_f
|
||||||
|
operators.each do |op, inv|
|
||||||
|
assert_equal(d.send(op, f), f.send(inv, d),
|
||||||
|
"(BigDecimal(#{s.inspect}) #{op} #{s}) and (#{s} #{inv} BigDecimal(#{s.inspect})) is different #{bug9192}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_cmp_nan
|
def test_cmp_nan
|
||||||
n1 = BigDecimal.new("1")
|
n1 = BigDecimal.new("1")
|
||||||
BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
|
BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
|
||||||
@ -608,8 +622,8 @@ class TestBigDecimal < Test::Unit::TestCase
|
|||||||
|
|
||||||
def test_coerce
|
def test_coerce
|
||||||
a, b = BigDecimal.new("1").coerce(1.0)
|
a, b = BigDecimal.new("1").coerce(1.0)
|
||||||
assert_instance_of(Float, a)
|
assert_instance_of(BigDecimal, a)
|
||||||
assert_instance_of(Float, b)
|
assert_instance_of(BigDecimal, b)
|
||||||
assert_equal(2, 1 + BigDecimal.new("1"), '[ruby-core:25697]')
|
assert_equal(2, 1 + BigDecimal.new("1"), '[ruby-core:25697]')
|
||||||
|
|
||||||
a, b = BigDecimal("1").coerce(1.quo(10))
|
a, b = BigDecimal("1").coerce(1.quo(10))
|
||||||
@ -1462,7 +1476,7 @@ class TestBigDecimal < Test::Unit::TestCase
|
|||||||
|
|
||||||
def test_BigMath_log_with_101
|
def test_BigMath_log_with_101
|
||||||
# this is mainly a performance test (should be very fast, not the 0.3 s)
|
# this is mainly a performance test (should be very fast, not the 0.3 s)
|
||||||
assert_in_delta(Math.log(101), BigMath.log(101, 20), 1E-20)
|
assert_in_delta(Math.log(101), BigMath.log(101, 20), 1E-15)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_BigMath_log_with_reciprocal_of_42
|
def test_BigMath_log_with_reciprocal_of_42
|
||||||
|
Loading…
x
Reference in New Issue
Block a user