summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-11 13:03:46 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-03-11 13:03:46 +0000
commitea52cac1487cea91a148daffbfe0dacef672051b (patch)
tree4a223af18f6b18978aedda2c11bfe771254a990e /numeric.c
parent2f1cc54d5fd9078c90ad240fce4f132feb1eaffe (diff)
merge revision(s) 57227: [Backport #13078]
numeric.c: reduce fdiv * numeric.c (rb_int_fdiv_double): reduce first for more precise result. [ruby-core:78886] [Bug #13078] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@57840 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/numeric.c b/numeric.c
index 01f9f45420..28ad30d764 100644
--- a/numeric.c
+++ b/numeric.c
@@ -3614,6 +3614,13 @@ fix_fdiv_double(VALUE x, VALUE y)
double
rb_int_fdiv_double(VALUE x, VALUE y)
{
+ if (RB_INTEGER_TYPE_P(y) && !FIXNUM_ZERO_P(y)) {
+ VALUE gcd = rb_gcd(x, y);
+ if (!FIXNUM_ZERO_P(gcd)) {
+ x = rb_int_idiv(x, gcd);
+ y = rb_int_idiv(y, gcd);
+ }
+ }
if (FIXNUM_P(x)) {
return fix_fdiv_double(x, y);
}