|
@@ -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;
|