diff options
Diffstat (limited to 'src/math/ilogbf.c')
| -rw-r--r-- | src/math/ilogbf.c | 14 | 
1 files changed, 8 insertions, 6 deletions
| diff --git a/src/math/ilogbf.c b/src/math/ilogbf.c index 42cd62e2..e23ba209 100644 --- a/src/math/ilogbf.c +++ b/src/math/ilogbf.c @@ -3,22 +3,24 @@  int ilogbf(float x)  { -	union fshape u = {x}; -	int e = u.bits>>23 & 0xff; +	#pragma STDC FENV_ACCESS ON +	union {float f; uint32_t i;} u = {x}; +	uint32_t i = u.i; +	int e = i>>23 & 0xff;  	if (!e) { -		u.bits <<= 9; -		if (u.bits == 0) { +		i <<= 9; +		if (i == 0) {  			FORCE_EVAL(0/0.0f);  			return FP_ILOGB0;  		}  		/* subnormal x */ -		for (e = -0x7f; u.bits < (uint32_t)1<<31; e--, u.bits<<=1); +		for (e = -0x7f; i>>31 == 0; e--, i<<=1);  		return e;  	}  	if (e == 0xff) {  		FORCE_EVAL(0/0.0f); -		return u.bits<<9 ? FP_ILOGBNAN : INT_MAX; +		return i<<9 ? FP_ILOGBNAN : INT_MAX;  	}  	return e - 0x7f;  } | 
