diff options
Diffstat (limited to 'src/math/__fpclassifyl.c')
| -rw-r--r-- | src/math/__fpclassifyl.c | 28 | 
1 files changed, 14 insertions, 14 deletions
diff --git a/src/math/__fpclassifyl.c b/src/math/__fpclassifyl.c index e4d231b5..6365c588 100644 --- a/src/math/__fpclassifyl.c +++ b/src/math/__fpclassifyl.c @@ -3,28 +3,28 @@  #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024  #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 +/* invalid representations (top bit of u.i.m is wrong) are not handled */  int __fpclassifyl(long double x)  { -	union ldshape u = { x }; -	int e = u.bits.exp; -	if (!e) { -		if (u.bits.m >> 63) return FP_NAN; -		else if (u.bits.m) return FP_SUBNORMAL; -		else return FP_ZERO; -	} +	union ldshape u = {x}; +	int e = u.i.se & 0x7fff; +	if (!e) +		return u.i.m ? FP_SUBNORMAL : FP_ZERO;  	if (e == 0x7fff) -		return u.bits.m & (uint64_t)-1>>1 ? FP_NAN : FP_INFINITE; -	return u.bits.m & (uint64_t)1<<63 ? FP_NORMAL : FP_NAN; +		return u.i.m << 1 ? FP_NAN : FP_INFINITE; +	return FP_NORMAL;  }  #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384  int __fpclassifyl(long double x)  { -	union ldshape u = { x }; -	int e = u.bits.exp; +	union ldshape u = {x}; +	int e = u.i.se & 0x7fff;  	if (!e) -		return u.bits.mlo | u.bits.mhi ? FP_SUBNORMAL : FP_ZERO; -	if (e == 0x7fff) -		return u.bits.mlo | u.bits.mhi ? FP_NAN : FP_INFINITE; +		return u.i2.lo | u.i2.hi ? FP_SUBNORMAL : FP_ZERO; +	if (e == 0x7fff) { +		u.i.se = 0; +		return u.i2.lo | u.i2.hi ? FP_NAN : FP_INFINITE; +	}  	return FP_NORMAL;  }  #endif  | 
