| 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)
 |