diff options
Diffstat (limited to 'src/math/ilogb.c')
| -rw-r--r-- | src/math/ilogb.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/src/math/ilogb.c b/src/math/ilogb.c new file mode 100644 index 00000000..c5915a0c --- /dev/null +++ b/src/math/ilogb.c @@ -0,0 +1,21 @@ +#include <limits.h> +#include "libm.h" + +int ilogb(double x) +{ +	union dshape u = {x}; +	int e = u.bits>>52 & 0x7ff; + +	if (!e) { +		u.bits <<= 12; +		if (u.bits == 0) +			return FP_ILOGB0; +		/* subnormal x */ +		// FIXME: scale up subnormals with a *0x1p53 or find top set bit with a better method +		for (e = -0x3ff; u.bits < (uint64_t)1<<63; e--, u.bits<<=1); +		return e; +	} +	if (e == 0x7ff) +		return u.bits<<12 ? FP_ILOGBNAN : INT_MAX; +	return e - 0x3ff; +}  | 
