diff options
Diffstat (limited to 'src/math/ilogbf.c')
-rw-r--r-- | src/math/ilogbf.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/math/ilogbf.c b/src/math/ilogbf.c new file mode 100644 index 00000000..272cbdac --- /dev/null +++ b/src/math/ilogbf.c @@ -0,0 +1,20 @@ +#include <limits.h> +#include "libm.h" + +int ilogbf(float x) +{ + union fshape u = {x}; + int e = u.bits>>23 & 0xff; + + if (!e) { + u.bits <<= 9; + if (u.bits == 0) + return FP_ILOGB0; + /* subnormal x */ + for (e = -0x7f; u.bits < (uint32_t)1<<31; e--, u.bits<<=1); + return e; + } + if (e == 0xff) + return u.bits<<9 ? FP_ILOGBNAN : INT_MAX; + return e - 0x7f; +} |