1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker modff(float x,float * iptr)3*c9945492SAndroid Build Coastguard Workerfloat modff(float x, float *iptr) 4*c9945492SAndroid Build Coastguard Worker { 5*c9945492SAndroid Build Coastguard Worker union {float f; uint32_t i;} u = {x}; 6*c9945492SAndroid Build Coastguard Worker uint32_t mask; 7*c9945492SAndroid Build Coastguard Worker int e = (int)(u.i>>23 & 0xff) - 0x7f; 8*c9945492SAndroid Build Coastguard Worker 9*c9945492SAndroid Build Coastguard Worker /* no fractional part */ 10*c9945492SAndroid Build Coastguard Worker if (e >= 23) { 11*c9945492SAndroid Build Coastguard Worker *iptr = x; 12*c9945492SAndroid Build Coastguard Worker if (e == 0x80 && u.i<<9 != 0) { /* nan */ 13*c9945492SAndroid Build Coastguard Worker return x; 14*c9945492SAndroid Build Coastguard Worker } 15*c9945492SAndroid Build Coastguard Worker u.i &= 0x80000000; 16*c9945492SAndroid Build Coastguard Worker return u.f; 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 &= 0x80000000; 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 = 0x007fffff>>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 &= 0x80000000; 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