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