12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /* round.c
- *
- * Round double to nearest or even integer valued double
- *
- *
- *
- * SYNOPSIS:
- *
- * double x, y, round();
- *
- * y = round(x);
- *
- *
- *
- * DESCRIPTION:
- *
- * 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.
- */
- /*
- 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 x;
- {
- double y, r;
- /* Largest integer <= x */
- y = floor(x);
- /* Fractional part */
- r = x - y;
- /* Round up to nearest. */
- if( r > 0.5 )
- goto rndup;
- /* Round to even */
- if( r == 0.5 )
- {
- r = y - 2.0 * floor( 0.5 * y );
- if( r == 1.0 )
- {
- rndup:
- y += 1.0;
- }
- }
- /* Else round down. */
- return(y);
- }
|