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; +} |