1#include "libm.h"
2
3float ceilf(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 == 0)
17			u.i += m;
18		u.i &= ~m;
19	} else {
20		FORCE_EVAL(x + 0x1p120f);
21		if (u.i >> 31)
22			u.f = -0.0;
23		else if (u.i << 1)
24			u.f = 1.0;
25	}
26	return u.f;
27}
28