summaryrefslogtreecommitdiff
path: root/libm/double/round.c
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2001-06-19 22:53:41 +0000
committerManuel Novoa III <mjn3@codepoet.org>2001-06-19 22:53:41 +0000
commit4ab8b2dd6e571b8dafe69a4d7a09a451cc9b1645 (patch)
tree6824a635f8300a340b520382a1ec694e6544a7af /libm/double/round.c
parente10f6cc02bf6589700872266f1819af56a2d79f6 (diff)
Remove Erik's broken implementation of rint(). Replace it by one "less broken".
Also correct rounding beharior of round() and add trunc(). Note that round() and rint() currently don't check for infs and nans. I decided to wait on that until the big cleanup.
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;