aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-03 00:34:31 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-04-03 00:34:31 +0000
commitb4c0aac4c8ca217a3579e3e95fb2e7c993234955 (patch)
tree75c0ad890d02af2ece2ec7983800d867dbeb624a
parent2b82986034688e90ff7de092c4bc6b75b1510d0b (diff)
downloadruby-b4c0aac4c8ca217a3579e3e95fb2e7c993234955.tar.gz
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
-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);