fix struct layout mismatch in sound ioctl time32 fallback conversion
[musl.git] / src / math / modf.c
blob1c8a1db90db7b4b61c5ec4271f184308690704db
1 #include "libm.h"
3 double modf(double x, double *iptr)
5 union {double f; uint64_t i;} u = {x};
6 uint64_t mask;
7 int e = (int)(u.i>>52 & 0x7ff) - 0x3ff;
9 /* no fractional part */
10 if (e >= 52) {
11 *iptr = x;
12 if (e == 0x400 && u.i<<12 != 0) /* nan */
13 return x;
14 u.i &= 1ULL<<63;
15 return u.f;
18 /* no integral part*/
19 if (e < 0) {
20 u.i &= 1ULL<<63;
21 *iptr = u.f;
22 return x;
25 mask = -1ULL>>12>>e;
26 if ((u.i & mask) == 0) {
27 *iptr = x;
28 u.i &= 1ULL<<63;
29 return u.f;
31 u.i &= ~mask;
32 *iptr = u.f;
33 return x - u.f;