blob: dceec739dbef5c4039fd4a5c7cf5c95ac593777d [file] [log] [blame]
Rich Felkerb69f6952012-03-13 01:17:53 -04001#include "libm.h"
2
Rich Felkerb69f6952012-03-13 01:17:53 -04003float floorf(float x)
4{
Szabolcs Nagyd1a2ead2013-09-03 03:27:02 +00005 union {float f; uint32_t i;} u = {x};
6 int e = (int)(u.i >> 23 & 0xff) - 0x7f;
7 uint32_t m;
Rich Felkerb69f6952012-03-13 01:17:53 -04008
Szabolcs Nagyd1a2ead2013-09-03 03:27:02 +00009 if (e >= 23)
10 return x;
11 if (e >= 0) {
12 m = 0x007fffff >> e;
13 if ((u.i & m) == 0)
14 return x;
15 FORCE_EVAL(x + 0x1p120f);
16 if (u.i >> 31)
17 u.i += m;
18 u.i &= ~m;
Rich Felkerb69f6952012-03-13 01:17:53 -040019 } else {
Szabolcs Nagyd1a2ead2013-09-03 03:27:02 +000020 FORCE_EVAL(x + 0x1p120f);
21 if (u.i >> 31 == 0)
22 u.i = 0;
23 else if (u.i << 1)
24 u.f = -1.0;
Rich Felkerb69f6952012-03-13 01:17:53 -040025 }
Szabolcs Nagyd1a2ead2013-09-03 03:27:02 +000026 return u.f;
Rich Felkerb69f6952012-03-13 01:17:53 -040027}