123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /*
- * ====================================================
- * 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)
|