| 1234567891011121314151617181920212223242526272829303132333435363738 | #include <limits.h>#include <math.h>/********************************************************************************                                                                              **     The function nearbyint rounds its double argument to integral value      **     according to the current rounding direction and returns the result in    **     double format.  This function does not signal inexact.                   **                                                                              **********************************************************************************                                                                              **     This function calls fabs and copysign.		                         **                                                                              ********************************************************************************/static const double twoTo52      = 4503599627370496.0;libm_hidden_proto(nearbyint)double nearbyint ( double x )      {	double y;	double OldEnvironment;	y = twoTo52;	asm ("mffs %0" : "=f" (OldEnvironment));	/* get the environement */      if ( fabs ( x ) >= y )                          /* huge case is exact */            return x;      if ( x < 0 ) y = -y;                                   /* negative case */      y = ( x + y ) - y;                                    /* force rounding */      if ( y == 0.0 )                        /* zero results mirror sign of x */            y = copysign ( y, x );//	restore old flags	asm ("mtfsf 255,%0" : /*NULLOUT*/ : /*IN*/ "f" ( OldEnvironment ));      return ( y );	}libm_hidden_def(nearbyint)
 |