From 70191b6a284ce2d53797c08a74b9a643e9ddf666 Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 3 Apr 2016 00:34:31 +0000 Subject: numeric.c: dbl2ival no longer rounds * numeric.c (flodivmod): round division if it is a finite number and module is required. * numeric.c (dbl2ival): do not round here. * numeric.c (flo_ceil): use dbl2ival. * numeric.c (flo_round): round explicitly. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54477 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 +++++++++++ numeric.c | 15 +++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c523b69fb..95ec032891 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Sun Apr 3 09:34:29 2016 Nobuyoshi Nakada + + * numeric.c (flodivmod): round division if it is a finite number + and module is required. + + * numeric.c (dbl2ival): do not round here. + + * numeric.c (flo_ceil): use dbl2ival. + + * numeric.c (flo_round): round explicitly. + Sat Apr 2 15:24:18 2016 Nobuyoshi Nakada * include/ruby/intern.h (rb_check_arity): returns argc. diff --git a/numeric.c b/numeric.c index 6910827762..131fa84d62 100644 --- a/numeric.c +++ b/numeric.c @@ -1008,8 +1008,10 @@ flodivmod(double x, double y, double *divp, double *modp) } if (isinf(x) && !isinf(y)) div = x; - else + else { div = (x - mod) / y; + if (modp && divp) div = round(div); + } if (y*mod < 0) { mod += y; div -= 1.0; @@ -1066,7 +1068,6 @@ flo_mod(VALUE x, VALUE y) static VALUE dbl2ival(double d) { - d = round(d); if (FIXABLE(d)) { return LONG2FIX((long)d); } @@ -1761,13 +1762,7 @@ static VALUE flo_ceil(VALUE num) { double f = ceil(RFLOAT_VALUE(num)); - long val; - - if (!FIXABLE(f)) { - return rb_dbl2big(f); - } - val = (long)f; - return LONG2FIX(val); + return dbl2ival(f); } /* @@ -1856,7 +1851,7 @@ flo_round(int argc, VALUE *argv, VALUE num) } number = RFLOAT_VALUE(num); if (ndigits == 0) { - return dbl2ival(number); + return dbl2ival(round(number)); } frexp(number, &binexp); -- cgit v1.2.3