• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "libm.h"
2 
floorf(float x)3 float floorf(float x)
4 {
5 	union {float f; uint32_t i;} u = {x};
6 	int e = (int)(u.i >> 23 & 0xff) - 0x7f;
7 	uint32_t m;
8 
9 	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;
19 	} else {
20 		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;
25 	}
26 	return u.f;
27 }
28