xref: /aosp_15_r20/external/musl/src/math/ceilf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
ceilf(float x)3*c9945492SAndroid Build Coastguard Worker float ceilf(float x)
4*c9945492SAndroid Build Coastguard Worker {
5*c9945492SAndroid Build Coastguard Worker 	union {float f; uint32_t i;} u = {x};
6*c9945492SAndroid Build Coastguard Worker 	int e = (int)(u.i >> 23 & 0xff) - 0x7f;
7*c9945492SAndroid Build Coastguard Worker 	uint32_t m;
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker 	if (e >= 23)
10*c9945492SAndroid Build Coastguard Worker 		return x;
11*c9945492SAndroid Build Coastguard Worker 	if (e >= 0) {
12*c9945492SAndroid Build Coastguard Worker 		m = 0x007fffff >> e;
13*c9945492SAndroid Build Coastguard Worker 		if ((u.i & m) == 0)
14*c9945492SAndroid Build Coastguard Worker 			return x;
15*c9945492SAndroid Build Coastguard Worker 		FORCE_EVAL(x + 0x1p120f);
16*c9945492SAndroid Build Coastguard Worker 		if (u.i >> 31 == 0)
17*c9945492SAndroid Build Coastguard Worker 			u.i += m;
18*c9945492SAndroid Build Coastguard Worker 		u.i &= ~m;
19*c9945492SAndroid Build Coastguard Worker 	} else {
20*c9945492SAndroid Build Coastguard Worker 		FORCE_EVAL(x + 0x1p120f);
21*c9945492SAndroid Build Coastguard Worker 		if (u.i >> 31)
22*c9945492SAndroid Build Coastguard Worker 			u.f = -0.0;
23*c9945492SAndroid Build Coastguard Worker 		else if (u.i << 1)
24*c9945492SAndroid Build Coastguard Worker 			u.f = 1.0;
25*c9945492SAndroid Build Coastguard Worker 	}
26*c9945492SAndroid Build Coastguard Worker 	return u.f;
27*c9945492SAndroid Build Coastguard Worker }
28