diff options
Diffstat (limited to 'src/math')
| -rw-r--r-- | src/math/ilogb.c | 8 | ||||
| -rw-r--r-- | src/math/ilogbf.c | 8 | ||||
| -rw-r--r-- | src/math/ilogbl.c | 8 | 
3 files changed, 18 insertions, 6 deletions
| diff --git a/src/math/ilogb.c b/src/math/ilogb.c index 0a3a6a46..5a1819d8 100644 --- a/src/math/ilogb.c +++ b/src/math/ilogb.c @@ -8,13 +8,17 @@ int ilogb(double x)  	if (!e) {  		u.bits <<= 12; -		if (u.bits == 0) +		if (u.bits == 0) { +			FORCE_EVAL(0/0.0f);  			return FP_ILOGB0; +		}  		/* subnormal x */  		for (e = -0x3ff; u.bits < (uint64_t)1<<63; e--, u.bits<<=1);  		return e;  	} -	if (e == 0x7ff) +	if (e == 0x7ff) { +		FORCE_EVAL(0/0.0f);  		return u.bits<<12 ? FP_ILOGBNAN : INT_MAX; +	}  	return e - 0x3ff;  } diff --git a/src/math/ilogbf.c b/src/math/ilogbf.c index 272cbdac..42cd62e2 100644 --- a/src/math/ilogbf.c +++ b/src/math/ilogbf.c @@ -8,13 +8,17 @@ int ilogbf(float x)  	if (!e) {  		u.bits <<= 9; -		if (u.bits == 0) +		if (u.bits == 0) { +			FORCE_EVAL(0/0.0f);  			return FP_ILOGB0; +		}  		/* subnormal x */  		for (e = -0x7f; u.bits < (uint32_t)1<<31; e--, u.bits<<=1);  		return e;  	} -	if (e == 0xff) +	if (e == 0xff) { +		FORCE_EVAL(0/0.0f);  		return u.bits<<9 ? FP_ILOGBNAN : INT_MAX; +	}  	return e - 0x7f;  } diff --git a/src/math/ilogbl.c b/src/math/ilogbl.c index ed9ddcbc..1512934f 100644 --- a/src/math/ilogbl.c +++ b/src/math/ilogbl.c @@ -14,15 +14,19 @@ int ilogbl(long double x)  	int e = u.bits.exp;  	if (!e) { -		if (m == 0) +		if (m == 0) { +			FORCE_EVAL(0/0.0f);  			return FP_ILOGB0; +		}  		/* subnormal x */  		for (e = -0x3fff+1; m < (uint64_t)1<<63; e--, m<<=1);  		return e;  	} -	if (e == 0x7fff) +	if (e == 0x7fff) { +		FORCE_EVAL(0/0.0f);  		/* in ld80 msb is set in inf */  		return m & (uint64_t)-1>>1 ? FP_ILOGBNAN : INT_MAX; +	}  	return e - 0x3fff;  }  #endif | 
