t2ex/bsd_source/lib/libc/src_bsd/math/s_ilogb.c | bare source | permlink (0.02 seconds) |
1: /* @(#)s_ilogb.c 5.1 93/09/24 */ 2: /* 3: * ==================================================== 4: * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 5: * 6: * Developed at SunPro, a Sun Microsystems, Inc. business. 7: * Permission to use, copy, modify, and distribute this 8: * software is freely granted, provided that this notice 9: * is preserved. 10: * ==================================================== 11: */ 12: 13: /* ilogb(double x) 14: * return the binary exponent of non-zero x 15: * ilogb(0) = 0x80000001 16: * ilogb(inf/NaN) = 0x7fffffff (no signal is raised) 17: */ 18: 19: /* LINTLIBRARY */ 20: 21: #include <sys/cdefs.h> 22: #include <float.h> 23: #include <math.h> 24: 25: #include "math_private.h" 26: 27: int 28: ilogb(double x) 29: { 30: int32_t hx,lx,ix; 31: 32: GET_HIGH_WORD(hx,x); 33: hx &= 0x7fffffff; 34: if(hx<0x00100000) { 35: GET_LOW_WORD(lx,x); 36: if((hx|lx)==0) 37: return 0x80000001; /* ilogb(0) = 0x80000001 */ 38: else /* subnormal x */ 39: if(hx==0) { 40: for (ix = -1043; lx>0; lx<<=1) ix -=1; 41: } else { 42: for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; 43: } 44: return ix; 45: } 46: else if (hx<0x7ff00000) return (hx>>20)-1023; 47: else return 0x7fffffff; 48: } 49: 50: #if LDBL_MANT_DIG == 53 51: #ifdef lint 52: /* PROTOLIB1 */ 53: int ilogbl(long double); 54: #else /* lint */ 55: __weak_alias(ilogbl, ilogb); 56: #endif /* lint */ 57: #endif /* LDBL_MANT_DIG == 53 */