1*37da2899SCharles.Forsyth /* derived from /netlib/fdlibm */ 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsyth /* @(#)s_ilogb.c 1.3 95/01/18 */ 4*37da2899SCharles.Forsyth /* 5*37da2899SCharles.Forsyth * ==================================================== 6*37da2899SCharles.Forsyth * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 7*37da2899SCharles.Forsyth * 8*37da2899SCharles.Forsyth * Developed at SunSoft, a Sun Microsystems, Inc. business. 9*37da2899SCharles.Forsyth * Permission to use, copy, modify, and distribute this 10*37da2899SCharles.Forsyth * software is freely granted, provided that this notice 11*37da2899SCharles.Forsyth * is preserved. 12*37da2899SCharles.Forsyth * ==================================================== 13*37da2899SCharles.Forsyth */ 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsyth /* ilogb(double x) 16*37da2899SCharles.Forsyth * return the binary exponent of non-zero x 17*37da2899SCharles.Forsyth * ilogb(0) = 0x80000001 18*37da2899SCharles.Forsyth * ilogb(inf/NaN) = 0x7fffffff (no signal is raised) 19*37da2899SCharles.Forsyth */ 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsyth #include "fdlibm.h" 22*37da2899SCharles.Forsyth ilogb(double x)23*37da2899SCharles.Forsyth int ilogb(double x) 24*37da2899SCharles.Forsyth { 25*37da2899SCharles.Forsyth int hx,lx,ix; 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth hx = (__HI(x))&0x7fffffff; /* high word of x */ 28*37da2899SCharles.Forsyth if(hx<0x00100000) { 29*37da2899SCharles.Forsyth lx = __LO(x); 30*37da2899SCharles.Forsyth if((hx|lx)==0) 31*37da2899SCharles.Forsyth return 0x80000001; /* ilogb(0) = 0x80000001 */ 32*37da2899SCharles.Forsyth else /* subnormal x */ 33*37da2899SCharles.Forsyth if(hx==0) { 34*37da2899SCharles.Forsyth for (ix = -1043; lx>0; lx<<=1) ix -=1; 35*37da2899SCharles.Forsyth } else { 36*37da2899SCharles.Forsyth for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; 37*37da2899SCharles.Forsyth } 38*37da2899SCharles.Forsyth return ix; 39*37da2899SCharles.Forsyth } 40*37da2899SCharles.Forsyth else if (hx<0x7ff00000) return (hx>>20)-1023; 41*37da2899SCharles.Forsyth else return 0x7fffffff; 42*37da2899SCharles.Forsyth } 43