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