1 #include "libm.h" 2 modff(float x,float * iptr)3float modff(float x, float *iptr) 4 { 5 union {float f; uint32_t i;} u = {x}; 6 uint32_t mask; 7 int e = (int)(u.i>>23 & 0xff) - 0x7f; 8 9 /* no fractional part */ 10 if (e >= 23) { 11 *iptr = x; 12 if (e == 0x80 && u.i<<9 != 0) { /* nan */ 13 return x; 14 } 15 u.i &= 0x80000000; 16 return u.f; 17 } 18 /* no integral part */ 19 if (e < 0) { 20 u.i &= 0x80000000; 21 *iptr = u.f; 22 return x; 23 } 24 25 mask = 0x007fffff>>e; 26 if ((u.i & mask) == 0) { 27 *iptr = x; 28 u.i &= 0x80000000; 29 return u.f; 30 } 31 u.i &= ~mask; 32 *iptr = u.f; 33 return x - u.f; 34 } 35