1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker modf(double x,double * iptr)3*c9945492SAndroid Build Coastguard Workerdouble modf(double x, double *iptr) 4*c9945492SAndroid Build Coastguard Worker { 5*c9945492SAndroid Build Coastguard Worker union {double f; uint64_t i;} u = {x}; 6*c9945492SAndroid Build Coastguard Worker uint64_t mask; 7*c9945492SAndroid Build Coastguard Worker int e = (int)(u.i>>52 & 0x7ff) - 0x3ff; 8*c9945492SAndroid Build Coastguard Worker 9*c9945492SAndroid Build Coastguard Worker /* no fractional part */ 10*c9945492SAndroid Build Coastguard Worker if (e >= 52) { 11*c9945492SAndroid Build Coastguard Worker *iptr = x; 12*c9945492SAndroid Build Coastguard Worker if (e == 0x400 && u.i<<12 != 0) /* nan */ 13*c9945492SAndroid Build Coastguard Worker return x; 14*c9945492SAndroid Build Coastguard Worker u.i &= 1ULL<<63; 15*c9945492SAndroid Build Coastguard Worker return u.f; 16*c9945492SAndroid Build Coastguard Worker } 17*c9945492SAndroid Build Coastguard Worker 18*c9945492SAndroid Build Coastguard Worker /* no integral part*/ 19*c9945492SAndroid Build Coastguard Worker if (e < 0) { 20*c9945492SAndroid Build Coastguard Worker u.i &= 1ULL<<63; 21*c9945492SAndroid Build Coastguard Worker *iptr = u.f; 22*c9945492SAndroid Build Coastguard Worker return x; 23*c9945492SAndroid Build Coastguard Worker } 24*c9945492SAndroid Build Coastguard Worker 25*c9945492SAndroid Build Coastguard Worker mask = -1ULL>>12>>e; 26*c9945492SAndroid Build Coastguard Worker if ((u.i & mask) == 0) { 27*c9945492SAndroid Build Coastguard Worker *iptr = x; 28*c9945492SAndroid Build Coastguard Worker u.i &= 1ULL<<63; 29*c9945492SAndroid Build Coastguard Worker return u.f; 30*c9945492SAndroid Build Coastguard Worker } 31*c9945492SAndroid Build Coastguard Worker u.i &= ~mask; 32*c9945492SAndroid Build Coastguard Worker *iptr = u.f; 33*c9945492SAndroid Build Coastguard Worker return x - u.f; 34*c9945492SAndroid Build Coastguard Worker } 35