summaryrefslogtreecommitdiff
path: root/libm/double/round.c
diff options
context:
space:
mode:
Diffstat (limited to 'libm/double/round.c')
-rw-r--r--libm/double/round.c69
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;