1*c9945492SAndroid Build Coastguard Worker #include <float.h> 2*c9945492SAndroid Build Coastguard Worker #include <math.h> 3*c9945492SAndroid Build Coastguard Worker #include <stdint.h> 4*c9945492SAndroid Build Coastguard Worker 5*c9945492SAndroid Build Coastguard Worker #if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1 6*c9945492SAndroid Build Coastguard Worker #define EPS DBL_EPSILON 7*c9945492SAndroid Build Coastguard Worker #elif FLT_EVAL_METHOD==2 8*c9945492SAndroid Build Coastguard Worker #define EPS LDBL_EPSILON 9*c9945492SAndroid Build Coastguard Worker #endif 10*c9945492SAndroid Build Coastguard Worker static const double_t toint = 1/EPS; 11*c9945492SAndroid Build Coastguard Worker rint(double x)12*c9945492SAndroid Build Coastguard Workerdouble rint(double x) 13*c9945492SAndroid Build Coastguard Worker { 14*c9945492SAndroid Build Coastguard Worker union {double f; uint64_t i;} u = {x}; 15*c9945492SAndroid Build Coastguard Worker int e = u.i>>52 & 0x7ff; 16*c9945492SAndroid Build Coastguard Worker int s = u.i>>63; 17*c9945492SAndroid Build Coastguard Worker double_t y; 18*c9945492SAndroid Build Coastguard Worker 19*c9945492SAndroid Build Coastguard Worker if (e >= 0x3ff+52) 20*c9945492SAndroid Build Coastguard Worker return x; 21*c9945492SAndroid Build Coastguard Worker if (s) 22*c9945492SAndroid Build Coastguard Worker y = x - toint + toint; 23*c9945492SAndroid Build Coastguard Worker else 24*c9945492SAndroid Build Coastguard Worker y = x + toint - toint; 25*c9945492SAndroid Build Coastguard Worker if (y == 0) 26*c9945492SAndroid Build Coastguard Worker return s ? -0.0 : 0; 27*c9945492SAndroid Build Coastguard Worker return y; 28*c9945492SAndroid Build Coastguard Worker } 29