1#include "libm.h"
2
3float floorf(float x) {
4    union {
5        float f;
6        uint32_t i;
7    } u = {x};
8    int e = (int)(u.i >> 23 & 0xff) - 0x7f;
9    uint32_t m;
10
11    if (e >= 23)
12        return x;
13    if (e >= 0) {
14        m = 0x007fffff >> e;
15        if ((u.i & m) == 0)
16            return x;
17        FORCE_EVAL(x + 0x1p120f);
18        if (u.i >> 31)
19            u.i += m;
20        u.i &= ~m;
21    } else {
22        FORCE_EVAL(x + 0x1p120f);
23        if (u.i >> 31 == 0)
24            u.i = 0;
25        else if (u.i << 1)
26            u.f = -1.0;
27    }
28    return u.f;
29}
30