diff options
Diffstat (limited to 'libm/double/round.c')
-rw-r--r-- | libm/double/round.c | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/libm/double/round.c b/libm/double/round.c index df4564a0f..c80ae66a0 100644 --- a/libm/double/round.c +++ b/libm/double/round.c @@ -1,45 +1,54 @@ -/* round.c - * - * Round double to nearest or even integer valued double - * - * - * - * SYNOPSIS: - * - * double x, y, round(); - * - * y = round(x); - * +/* + * June 19, 2001 Manuel Novoa III * + * Replaced cephes round (which was actually round to nearest or even) + * with a (really lame actually) version that always rounds away from 0 + * in conformance with ANSI/ISO. * - * DESCRIPTION: + * This doesn't check for inf or nan (hence the lame part) but the + * cephes function it replaces didn't either. I plan to deal with + * those issues when I rework things w.r.t. common code. * + * Also, for now rename the original cephes round routine to rint since + * it behaves the same for the default rounding mode (round to nearest). + * This will have to be changed off course when floating point env + * control functions are added. + */ + +#include <math.h> + +double round(x) +double x; +{ + double ax, fax; + + ax = fabs(x); + fax = floor(ax); + if (ax - fax >= 0.5) { + fax += 1.0; + } + if (x < 0) { + x = -fax; + } else { + x = fax; + } + return x; +} + +/***********************************************************************/ +/* * Returns the nearest integer to x as a double precision * floating point result. If x ends in 0.5 exactly, the * nearest even integer is chosen. - * - * - * - * ACCURACY: - * - * If x is greater than 1/(2*MACHEP), its closest machine - * representation is already an integer, so rounding does - * not change it. - */ - + * / /* +Originally round from Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ -#include <math.h> -#ifdef ANSIPROT -double floor ( double ); -#else -double floor(); -#endif -double round(x) +double rint(x) double x; { double y, r; |