1 #include "libm.h" 2 3 #if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 4 #define EPS DBL_EPSILON 5 #elif FLT_EVAL_METHOD==2 6 #define EPS LDBL_EPSILON 7 #endif 8 static const double_t toint = 1/EPS; 9 round(double x)10double round(double x) 11 { 12 union {double f; uint64_t i;} u = {x}; 13 int e = u.i >> 52 & 0x7ff; 14 double_t y; 15 16 if (e >= 0x3ff+52) 17 return x; 18 if (u.i >> 63) 19 x = -x; 20 if (e < 0x3ff-1) { 21 /* raise inexact if x!=0 */ 22 FORCE_EVAL(x + toint); 23 return 0*u.f; 24 } 25 y = x + toint - toint - x; 26 if (y > 0.5) 27 y = y + x - 1; 28 else if (y <= -0.5) 29 y = y + x + 1; 30 else 31 y = y + x; 32 if (u.i >> 63) 33 y = -y; 34 return y; 35 } 36