1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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:
mrkn 2013-12-08 11:20:51 +00:00
parent e54e3d70a8
commit 0727a22c69
3 changed files with 27 additions and 4 deletions

View file

@ -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>
* NEWS: [DOC] update NEWS about GC.

View file

@ -797,7 +797,8 @@ BigDecimal_coerce(VALUE self, VALUE other)
Real *b;
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 {
if (RB_TYPE_P(other, T_RATIONAL)) {

View file

@ -438,6 +438,20 @@ class TestBigDecimal < Test::Unit::TestCase
assert_equal(0, BigDecimal("1E-1") <=> 10**(-1), '#4825')
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
n1 = BigDecimal.new("1")
BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
@ -608,8 +622,8 @@ class TestBigDecimal < Test::Unit::TestCase
def test_coerce
a, b = BigDecimal.new("1").coerce(1.0)
assert_instance_of(Float, a)
assert_instance_of(Float, b)
assert_instance_of(BigDecimal, a)
assert_instance_of(BigDecimal, b)
assert_equal(2, 1 + BigDecimal.new("1"), '[ruby-core:25697]')
a, b = BigDecimal("1").coerce(1.quo(10))
@ -1462,7 +1476,7 @@ class TestBigDecimal < Test::Unit::TestCase
def test_BigMath_log_with_101
# 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
def test_BigMath_log_with_reciprocal_of_42