aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--numeric.c15
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 <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.
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);