xref: /aosp_15_r20/external/musl/src/math/ilogbf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <limits.h>
2*c9945492SAndroid Build Coastguard Worker #include "libm.h"
3*c9945492SAndroid Build Coastguard Worker 
ilogbf(float x)4*c9945492SAndroid Build Coastguard Worker int ilogbf(float x)
5*c9945492SAndroid Build Coastguard Worker {
6*c9945492SAndroid Build Coastguard Worker 	#pragma STDC FENV_ACCESS ON
7*c9945492SAndroid Build Coastguard Worker 	union {float f; uint32_t i;} u = {x};
8*c9945492SAndroid Build Coastguard Worker 	uint32_t i = u.i;
9*c9945492SAndroid Build Coastguard Worker 	int e = i>>23 & 0xff;
10*c9945492SAndroid Build Coastguard Worker 
11*c9945492SAndroid Build Coastguard Worker 	if (!e) {
12*c9945492SAndroid Build Coastguard Worker 		i <<= 9;
13*c9945492SAndroid Build Coastguard Worker 		if (i == 0) {
14*c9945492SAndroid Build Coastguard Worker 			FORCE_EVAL(0/0.0f);
15*c9945492SAndroid Build Coastguard Worker 			return FP_ILOGB0;
16*c9945492SAndroid Build Coastguard Worker 		}
17*c9945492SAndroid Build Coastguard Worker 		/* subnormal x */
18*c9945492SAndroid Build Coastguard Worker 		for (e = -0x7f; i>>31 == 0; e--, i<<=1);
19*c9945492SAndroid Build Coastguard Worker 		return e;
20*c9945492SAndroid Build Coastguard Worker 	}
21*c9945492SAndroid Build Coastguard Worker 	if (e == 0xff) {
22*c9945492SAndroid Build Coastguard Worker 		FORCE_EVAL(0/0.0f);
23*c9945492SAndroid Build Coastguard Worker 		return i<<9 ? FP_ILOGBNAN : INT_MAX;
24*c9945492SAndroid Build Coastguard Worker 	}
25*c9945492SAndroid Build Coastguard Worker 	return e - 0x7f;
26*c9945492SAndroid Build Coastguard Worker }
27