xref: /aosp_15_r20/external/musl/src/math/modff.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libm.h"
2*c9945492SAndroid Build Coastguard Worker 
modff(float x,float * iptr)3*c9945492SAndroid Build Coastguard Worker float modff(float x, float *iptr)
4*c9945492SAndroid Build Coastguard Worker {
5*c9945492SAndroid Build Coastguard Worker 	union {float f; uint32_t i;} u = {x};
6*c9945492SAndroid Build Coastguard Worker 	uint32_t mask;
7*c9945492SAndroid Build Coastguard Worker 	int e = (int)(u.i>>23 & 0xff) - 0x7f;
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker 	/* no fractional part */
10*c9945492SAndroid Build Coastguard Worker 	if (e >= 23) {
11*c9945492SAndroid Build Coastguard Worker 		*iptr = x;
12*c9945492SAndroid Build Coastguard Worker 		if (e == 0x80 && u.i<<9 != 0) { /* nan */
13*c9945492SAndroid Build Coastguard Worker 			return x;
14*c9945492SAndroid Build Coastguard Worker 		}
15*c9945492SAndroid Build Coastguard Worker 		u.i &= 0x80000000;
16*c9945492SAndroid Build Coastguard Worker 		return u.f;
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 &= 0x80000000;
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 = 0x007fffff>>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 &= 0x80000000;
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