1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker 3*c9945492SAndroid Build Coastguard Worker #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 roundl(long double x)4*c9945492SAndroid Build Coastguard Workerlong double roundl(long double x) 5*c9945492SAndroid Build Coastguard Worker { 6*c9945492SAndroid Build Coastguard Worker return round(x); 7*c9945492SAndroid Build Coastguard Worker } 8*c9945492SAndroid Build Coastguard Worker #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 9*c9945492SAndroid Build Coastguard Worker 10*c9945492SAndroid Build Coastguard Worker static const long double toint = 1/LDBL_EPSILON; 11*c9945492SAndroid Build Coastguard Worker roundl(long double x)12*c9945492SAndroid Build Coastguard Workerlong double roundl(long double x) 13*c9945492SAndroid Build Coastguard Worker { 14*c9945492SAndroid Build Coastguard Worker union ldshape u = {x}; 15*c9945492SAndroid Build Coastguard Worker int e = u.i.se & 0x7fff; 16*c9945492SAndroid Build Coastguard Worker long double y; 17*c9945492SAndroid Build Coastguard Worker 18*c9945492SAndroid Build Coastguard Worker if (e >= 0x3fff+LDBL_MANT_DIG-1) 19*c9945492SAndroid Build Coastguard Worker return x; 20*c9945492SAndroid Build Coastguard Worker if (u.i.se >> 15) 21*c9945492SAndroid Build Coastguard Worker x = -x; 22*c9945492SAndroid Build Coastguard Worker if (e < 0x3fff-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.5) 28*c9945492SAndroid Build Coastguard Worker y = y + x - 1; 29*c9945492SAndroid Build Coastguard Worker else if (y <= -0.5) 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.se >> 15) 34*c9945492SAndroid Build Coastguard Worker y = -y; 35*c9945492SAndroid Build Coastguard Worker return y; 36*c9945492SAndroid Build Coastguard Worker } 37*c9945492SAndroid Build Coastguard Worker #endif 38