diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | numeric.c | 15 |
2 files changed, 16 insertions, 10 deletions
@@ -1,3 +1,14 @@ +Sun Apr 3 09:34:29 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * 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 <nobu@ruby-lang.org> * include/ruby/intern.h (rb_check_arity): returns argc. @@ -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); |