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 modfl(long double x,long double * iptr)4*c9945492SAndroid Build Coastguard Workerlong double modfl(long double x, long double *iptr) 5*c9945492SAndroid Build Coastguard Worker { 6*c9945492SAndroid Build Coastguard Worker double d; 7*c9945492SAndroid Build Coastguard Worker long double r; 8*c9945492SAndroid Build Coastguard Worker 9*c9945492SAndroid Build Coastguard Worker r = modf(x, &d); 10*c9945492SAndroid Build Coastguard Worker *iptr = d; 11*c9945492SAndroid Build Coastguard Worker return r; 12*c9945492SAndroid Build Coastguard Worker } 13*c9945492SAndroid Build Coastguard Worker #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 14*c9945492SAndroid Build Coastguard Worker 15*c9945492SAndroid Build Coastguard Worker static const long double toint = 1/LDBL_EPSILON; 16*c9945492SAndroid Build Coastguard Worker modfl(long double x,long double * iptr)17*c9945492SAndroid Build Coastguard Workerlong double modfl(long double x, long double *iptr) 18*c9945492SAndroid Build Coastguard Worker { 19*c9945492SAndroid Build Coastguard Worker union ldshape u = {x}; 20*c9945492SAndroid Build Coastguard Worker int e = (u.i.se & 0x7fff) - 0x3fff; 21*c9945492SAndroid Build Coastguard Worker int s = u.i.se >> 15; 22*c9945492SAndroid Build Coastguard Worker long double absx; 23*c9945492SAndroid Build Coastguard Worker long double y; 24*c9945492SAndroid Build Coastguard Worker 25*c9945492SAndroid Build Coastguard Worker /* no fractional part */ 26*c9945492SAndroid Build Coastguard Worker if (e >= LDBL_MANT_DIG-1) { 27*c9945492SAndroid Build Coastguard Worker *iptr = x; 28*c9945492SAndroid Build Coastguard Worker if (isnan(x)) 29*c9945492SAndroid Build Coastguard Worker return x; 30*c9945492SAndroid Build Coastguard Worker return s ? -0.0 : 0.0; 31*c9945492SAndroid Build Coastguard Worker } 32*c9945492SAndroid Build Coastguard Worker 33*c9945492SAndroid Build Coastguard Worker /* no integral part*/ 34*c9945492SAndroid Build Coastguard Worker if (e < 0) { 35*c9945492SAndroid Build Coastguard Worker *iptr = s ? -0.0 : 0.0; 36*c9945492SAndroid Build Coastguard Worker return x; 37*c9945492SAndroid Build Coastguard Worker } 38*c9945492SAndroid Build Coastguard Worker 39*c9945492SAndroid Build Coastguard Worker /* raises spurious inexact */ 40*c9945492SAndroid Build Coastguard Worker absx = s ? -x : x; 41*c9945492SAndroid Build Coastguard Worker y = absx + toint - toint - absx; 42*c9945492SAndroid Build Coastguard Worker if (y == 0) { 43*c9945492SAndroid Build Coastguard Worker *iptr = x; 44*c9945492SAndroid Build Coastguard Worker return s ? -0.0 : 0.0; 45*c9945492SAndroid Build Coastguard Worker } 46*c9945492SAndroid Build Coastguard Worker if (y > 0) 47*c9945492SAndroid Build Coastguard Worker y -= 1; 48*c9945492SAndroid Build Coastguard Worker if (s) 49*c9945492SAndroid Build Coastguard Worker y = -y; 50*c9945492SAndroid Build Coastguard Worker *iptr = x + y; 51*c9945492SAndroid Build Coastguard Worker return -y; 52*c9945492SAndroid Build Coastguard Worker } 53*c9945492SAndroid Build Coastguard Worker #endif 54