| /* |
| * ==================================================== |
| * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
| * |
| * Developed at SunPro, a Sun Microsystems, Inc. business. |
| * Permission to use, copy, modify, and distribute this |
| * software is freely granted, provided that this notice |
| * is preserved. |
| * ==================================================== |
| */ |
| |
| /* ilogb(double x) |
| * return the binary exponent of x |
| * ilogb(+-0) = FP_ILOGB0 |
| * ilogb(+-inf) = INT_MAX |
| * ilogb(NaN) = FP_ILOGBNAN (no signal is raised) |
| */ |
| |
| #include "math.h" |
| #include "math_private.h" |
| |
| int ilogb(double x) |
| { |
| int32_t hx,lx,ix; |
| |
| GET_HIGH_WORD(hx, x); |
| hx &= 0x7fffffff; |
| |
| if (hx < 0x00100000) { |
| GET_LOW_WORD(lx, x); |
| if ((hx|lx)==0) /* +-0, ilogb(0) = FP_ILOGB0 */ |
| return FP_ILOGB0; |
| /* subnormal x */ |
| ix = -1043; |
| if (hx != 0) { |
| ix = -1022; |
| lx = (hx << 11); |
| } |
| /* each leading zero mantissa bit makes exponent smaller */ |
| for (; lx > 0; lx <<= 1) |
| ix--; |
| return ix; |
| } |
| |
| if (hx < 0x7ff00000) /* normal x */ |
| return (hx>>20) - 1023; |
| |
| if (FP_ILOGBNAN != (~0U >> 1)) { |
| GET_LOW_WORD(lx, x); |
| if (hx == 0x7ff00000 && lx == 0) /* +-inf */ |
| return ~0U >> 1; /* = INT_MAX */ |
| } |
| |
| /* NAN. ilogb(NAN) = FP_ILOGBNAN */ |
| return FP_ILOGBNAN; |
| } |
| libm_hidden_def(ilogb) |