summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-04 00:55:15 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-04 00:55:15 +0000
commitcc80f139cdc2c7224afc496178d5c56a7f9cdd1c (patch)
tree1d1b42e4796061ff14c20b8631970a47f6b9cb95
parent1ae50df95d72f02dc4e8f2edf9502609fd95a8fd (diff)
bigdecimal.c: more precision
* ext/bigdecimal/bigdecimal.c (BigDecimal_div2): need more room for precision to round. [ruby-core:77475] [Bug #12805] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56336 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--ext/bigdecimal/bigdecimal.c2
-rw-r--r--test/bigdecimal/test_bigdecimal.rb6
3 files changed, 12 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 85af8f1873..8bc2101656 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Oct 4 09:55:12 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_div2): need more room
+ for precision to round. [ruby-core:77475] [Bug #12805]
+
Tue Oct 4 06:05:46 2016 NARUSE, Yui <naruse@ruby-lang.org>
* regcomp.c (onig_print_compiled_byte_code): make the shown address
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 8f41c725f8..623bd11cee 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -1533,7 +1533,7 @@ BigDecimal_div2(VALUE self, VALUE b, VALUE n)
size_t mx = ix + VpBaseFig()*2;
size_t pl = VpSetPrecLimit(0);
- GUARD_OBJ(cv, VpCreateRbObject(mx, "0"));
+ GUARD_OBJ(cv, VpCreateRbObject(mx + VpBaseFig(), "0"));
GUARD_OBJ(av, GetVpValue(self, 1));
GUARD_OBJ(bv, GetVpValue(b, 1));
mx = av->Prec + bv->Prec + 2;
diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb
index 4296b50c59..63a3e2747d 100644
--- a/test/bigdecimal/test_bigdecimal.rb
+++ b/test/bigdecimal/test_bigdecimal.rb
@@ -807,6 +807,12 @@ class TestBigDecimal < Test::Unit::TestCase
BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, false)
assert_equal(0, BigDecimal("0").div(BigDecimal("Infinity")))
end
+
+ x = BigDecimal.new("1")
+ y = BigDecimal.new("0.22")
+ (2..20).each do |i|
+ assert_equal ("0."+"45"*(i/2)+"5"*(i%2)+"E1"), x.div(y, i).to_s, "#{i}"
+ end
end
def test_abs_bigdecimal