xref: /aosp_15_r20/external/musl/src/math/trunc.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
trunc(double x)3*c9945492SAndroid Build Coastguard Worker double trunc(double x)
4*c9945492SAndroid Build Coastguard Worker {
5*c9945492SAndroid Build Coastguard Worker 	union {double f; uint64_t i;} u = {x};
6*c9945492SAndroid Build Coastguard Worker 	int e = (int)(u.i >> 52 & 0x7ff) - 0x3ff + 12;
7*c9945492SAndroid Build Coastguard Worker 	uint64_t m;
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker 	if (e >= 52 + 12)
10*c9945492SAndroid Build Coastguard Worker 		return x;
11*c9945492SAndroid Build Coastguard Worker 	if (e < 12)
12*c9945492SAndroid Build Coastguard Worker 		e = 1;
13*c9945492SAndroid Build Coastguard Worker 	m = -1ULL >> e;
14*c9945492SAndroid Build Coastguard Worker 	if ((u.i & m) == 0)
15*c9945492SAndroid Build Coastguard Worker 		return x;
16*c9945492SAndroid Build Coastguard Worker 	FORCE_EVAL(x + 0x1p120f);
17*c9945492SAndroid Build Coastguard Worker 	u.i &= ~m;
18*c9945492SAndroid Build Coastguard Worker 	return u.f;
19*c9945492SAndroid Build Coastguard Worker }
20