1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker 3*c9945492SAndroid Build Coastguard Worker #if FLT_EVAL_METHOD==0 4*c9945492SAndroid Build Coastguard Worker #define EPS FLT_EPSILON 5*c9945492SAndroid Build Coastguard Worker #elif 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 float_t toint = 1/EPS; 11*c9945492SAndroid Build Coastguard Worker roundf(float x)12*c9945492SAndroid Build Coastguard Workerfloat roundf(float x) 13*c9945492SAndroid Build Coastguard Worker { 14*c9945492SAndroid Build Coastguard Worker union {float f; uint32_t i;} u = {x}; 15*c9945492SAndroid Build Coastguard Worker int e = u.i >> 23 & 0xff; 16*c9945492SAndroid Build Coastguard Worker float_t y; 17*c9945492SAndroid Build Coastguard Worker 18*c9945492SAndroid Build Coastguard Worker if (e >= 0x7f+23) 19*c9945492SAndroid Build Coastguard Worker return x; 20*c9945492SAndroid Build Coastguard Worker if (u.i >> 31) 21*c9945492SAndroid Build Coastguard Worker x = -x; 22*c9945492SAndroid Build Coastguard Worker if (e < 0x7f-1) { 23*c9945492SAndroid Build Coastguard Worker FORCE_EVAL(x + toint); 24*c9945492SAndroid Build Coastguard Worker return 0*u.f; 25*c9945492SAndroid Build Coastguard Worker } 26*c9945492SAndroid Build Coastguard Worker y = x + toint - toint - x; 27*c9945492SAndroid Build Coastguard Worker if (y > 0.5f) 28*c9945492SAndroid Build Coastguard Worker y = y + x - 1; 29*c9945492SAndroid Build Coastguard Worker else if (y <= -0.5f) 30*c9945492SAndroid Build Coastguard Worker y = y + x + 1; 31*c9945492SAndroid Build Coastguard Worker else 32*c9945492SAndroid Build Coastguard Worker y = y + x; 33*c9945492SAndroid Build Coastguard Worker if (u.i >> 31) 34*c9945492SAndroid Build Coastguard Worker y = -y; 35*c9945492SAndroid Build Coastguard Worker return y; 36*c9945492SAndroid Build Coastguard Worker } 37