• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "libm.h"
2 
modff(float x,float * iptr)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