xref: /aosp_15_r20/external/musl/src/math/modf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
modf(double x,double * iptr)3*c9945492SAndroid Build Coastguard Worker double modf(double x, double *iptr)
4*c9945492SAndroid Build Coastguard Worker {
5*c9945492SAndroid Build Coastguard Worker 	union {double f; uint64_t i;} u = {x};
6*c9945492SAndroid Build Coastguard Worker 	uint64_t mask;
7*c9945492SAndroid Build Coastguard Worker 	int e = (int)(u.i>>52 & 0x7ff) - 0x3ff;
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker 	/* no fractional part */
10*c9945492SAndroid Build Coastguard Worker 	if (e >= 52) {
11*c9945492SAndroid Build Coastguard Worker 		*iptr = x;
12*c9945492SAndroid Build Coastguard Worker 		if (e == 0x400 && u.i<<12 != 0) /* nan */
13*c9945492SAndroid Build Coastguard Worker 			return x;
14*c9945492SAndroid Build Coastguard Worker 		u.i &= 1ULL<<63;
15*c9945492SAndroid Build Coastguard Worker 		return u.f;
16*c9945492SAndroid Build Coastguard Worker 	}
17*c9945492SAndroid Build Coastguard Worker 
18*c9945492SAndroid Build Coastguard Worker 	/* no integral part*/
19*c9945492SAndroid Build Coastguard Worker 	if (e < 0) {
20*c9945492SAndroid Build Coastguard Worker 		u.i &= 1ULL<<63;
21*c9945492SAndroid Build Coastguard Worker 		*iptr = u.f;
22*c9945492SAndroid Build Coastguard Worker 		return x;
23*c9945492SAndroid Build Coastguard Worker 	}
24*c9945492SAndroid Build Coastguard Worker 
25*c9945492SAndroid Build Coastguard Worker 	mask = -1ULL>>12>>e;
26*c9945492SAndroid Build Coastguard Worker 	if ((u.i & mask) == 0) {
27*c9945492SAndroid Build Coastguard Worker 		*iptr = x;
28*c9945492SAndroid Build Coastguard Worker 		u.i &= 1ULL<<63;
29*c9945492SAndroid Build Coastguard Worker 		return u.f;
30*c9945492SAndroid Build Coastguard Worker 	}
31*c9945492SAndroid Build Coastguard Worker 	u.i &= ~mask;
32*c9945492SAndroid Build Coastguard Worker 	*iptr = u.f;
33*c9945492SAndroid Build Coastguard Worker 	return x - u.f;
34*c9945492SAndroid Build Coastguard Worker }
35