getopt: fix null pointer arithmetic ub
[musl] / src / math / modff.c
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 }