xref: /aosp_15_r20/external/musl/src/math/roundf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
3*c9945492SAndroid Build Coastguard Worker #if FLT_EVAL_METHOD==0
4*c9945492SAndroid Build Coastguard Worker #define EPS FLT_EPSILON
5*c9945492SAndroid Build Coastguard Worker #elif FLT_EVAL_METHOD==1
6*c9945492SAndroid Build Coastguard Worker #define EPS DBL_EPSILON
7*c9945492SAndroid Build Coastguard Worker #elif FLT_EVAL_METHOD==2
8*c9945492SAndroid Build Coastguard Worker #define EPS LDBL_EPSILON
9*c9945492SAndroid Build Coastguard Worker #endif
10*c9945492SAndroid Build Coastguard Worker static const float_t toint = 1/EPS;
11*c9945492SAndroid Build Coastguard Worker 
roundf(float x)12*c9945492SAndroid Build Coastguard Worker float roundf(float x)
13*c9945492SAndroid Build Coastguard Worker {
14*c9945492SAndroid Build Coastguard Worker 	union {float f; uint32_t i;} u = {x};
15*c9945492SAndroid Build Coastguard Worker 	int e = u.i >> 23 & 0xff;
16*c9945492SAndroid Build Coastguard Worker 	float_t y;
17*c9945492SAndroid Build Coastguard Worker 
18*c9945492SAndroid Build Coastguard Worker 	if (e >= 0x7f+23)
19*c9945492SAndroid Build Coastguard Worker 		return x;
20*c9945492SAndroid Build Coastguard Worker 	if (u.i >> 31)
21*c9945492SAndroid Build Coastguard Worker 		x = -x;
22*c9945492SAndroid Build Coastguard Worker 	if (e < 0x7f-1) {
23*c9945492SAndroid Build Coastguard Worker 		FORCE_EVAL(x + toint);
24*c9945492SAndroid Build Coastguard Worker 		return 0*u.f;
25*c9945492SAndroid Build Coastguard Worker 	}
26*c9945492SAndroid Build Coastguard Worker 	y = x + toint - toint - x;
27*c9945492SAndroid Build Coastguard Worker 	if (y > 0.5f)
28*c9945492SAndroid Build Coastguard Worker 		y = y + x - 1;
29*c9945492SAndroid Build Coastguard Worker 	else if (y <= -0.5f)
30*c9945492SAndroid Build Coastguard Worker 		y = y + x + 1;
31*c9945492SAndroid Build Coastguard Worker 	else
32*c9945492SAndroid Build Coastguard Worker 		y = y + x;
33*c9945492SAndroid Build Coastguard Worker 	if (u.i >> 31)
34*c9945492SAndroid Build Coastguard Worker 		y = -y;
35*c9945492SAndroid Build Coastguard Worker 	return y;
36*c9945492SAndroid Build Coastguard Worker }
37