xref: /aosp_15_r20/external/musl/src/math/rint.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <float.h>
2*c9945492SAndroid Build Coastguard Worker #include <math.h>
3*c9945492SAndroid Build Coastguard Worker #include <stdint.h>
4*c9945492SAndroid Build Coastguard Worker 
5*c9945492SAndroid Build Coastguard Worker #if FLT_EVAL_METHOD==0 || 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 double_t toint = 1/EPS;
11*c9945492SAndroid Build Coastguard Worker 
rint(double x)12*c9945492SAndroid Build Coastguard Worker double rint(double x)
13*c9945492SAndroid Build Coastguard Worker {
14*c9945492SAndroid Build Coastguard Worker 	union {double f; uint64_t i;} u = {x};
15*c9945492SAndroid Build Coastguard Worker 	int e = u.i>>52 & 0x7ff;
16*c9945492SAndroid Build Coastguard Worker 	int s = u.i>>63;
17*c9945492SAndroid Build Coastguard Worker 	double_t y;
18*c9945492SAndroid Build Coastguard Worker 
19*c9945492SAndroid Build Coastguard Worker 	if (e >= 0x3ff+52)
20*c9945492SAndroid Build Coastguard Worker 		return x;
21*c9945492SAndroid Build Coastguard Worker 	if (s)
22*c9945492SAndroid Build Coastguard Worker 		y = x - toint + toint;
23*c9945492SAndroid Build Coastguard Worker 	else
24*c9945492SAndroid Build Coastguard Worker 		y = x + toint - toint;
25*c9945492SAndroid Build Coastguard Worker 	if (y == 0)
26*c9945492SAndroid Build Coastguard Worker 		return s ? -0.0 : 0;
27*c9945492SAndroid Build Coastguard Worker 	return y;
28*c9945492SAndroid Build Coastguard Worker }
29