mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
numeric.c: round_to_nearest
* numeric.c (round_to_nearest): extract and reduce for platforms where round is not available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55897 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
dfe1d4fda6
commit
ab65e9d983
1 changed files with 26 additions and 7 deletions
33
numeric.c
33
numeric.c
|
@ -92,6 +92,31 @@ round(double x)
|
|||
}
|
||||
#endif
|
||||
|
||||
static double
|
||||
round_to_nearest(double x, double s)
|
||||
{
|
||||
double f, xs = x * s;
|
||||
|
||||
#ifdef HAVE_ROUND
|
||||
f = round(xs);
|
||||
#endif
|
||||
if (x > 0) {
|
||||
#ifndef HAVE_ROUND
|
||||
f = floor(xs);
|
||||
#endif
|
||||
if ((double)((f + 0.5) / s) <= x) f += 1;
|
||||
x = f;
|
||||
}
|
||||
else {
|
||||
#ifndef HAVE_ROUND
|
||||
f = ceil(xs);
|
||||
#endif
|
||||
if ((double)((f - 0.5) / s) >= x) f -= 1;
|
||||
x = f;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
static VALUE fix_uminus(VALUE num);
|
||||
static VALUE fix_mul(VALUE x, VALUE y);
|
||||
static VALUE fix_lshift(long, unsigned long);
|
||||
|
@ -2089,13 +2114,7 @@ flo_round(int argc, VALUE *argv, VALUE num)
|
|||
}
|
||||
if (float_invariant_round(number, ndigits, &num)) return num;
|
||||
f = pow(10, ndigits);
|
||||
x = round(number * f);
|
||||
if (x > 0) {
|
||||
if ((double)((x + 0.5) / f) <= number) x += 1;
|
||||
}
|
||||
else {
|
||||
if ((double)((x - 0.5) / f) >= number) x -= 1;
|
||||
}
|
||||
x = round_to_nearest(number, f);
|
||||
return DBL2NUM(x / f);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue