aboutsummaryrefslogtreecommitdiffstats
path: root/numeric.c
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 /numeric.c
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
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c15
1 files changed, 5 insertions, 10 deletions
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);