modff.c raw

   1  #include "libm.h"
   2  
   3  float 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