13a8617a8SJordan K. Hubbard /* @(#)s_ilogb.c 5.1 93/09/24 */ 23a8617a8SJordan K. Hubbard /* 33a8617a8SJordan K. Hubbard * ==================================================== 43a8617a8SJordan K. Hubbard * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 53a8617a8SJordan K. Hubbard * 63a8617a8SJordan K. Hubbard * Developed at SunPro, a Sun Microsystems, Inc. business. 73a8617a8SJordan K. Hubbard * Permission to use, copy, modify, and distribute this 83a8617a8SJordan K. Hubbard * software is freely granted, provided that this notice 93a8617a8SJordan K. Hubbard * is preserved. 103a8617a8SJordan K. Hubbard * ==================================================== 113a8617a8SJordan K. Hubbard */ 123a8617a8SJordan K. Hubbard 133a8617a8SJordan K. Hubbard #ifndef lint 143a8617a8SJordan K. Hubbard static char rcsid[] = "$Id: s_ilogb.c,v 1.6 1994/08/18 23:06:52 jtc Exp $"; 153a8617a8SJordan K. Hubbard #endif 163a8617a8SJordan K. Hubbard 173a8617a8SJordan K. Hubbard /* ilogb(double x) 183a8617a8SJordan K. Hubbard * return the binary exponent of non-zero x 193a8617a8SJordan K. Hubbard * ilogb(0) = 0x80000001 203a8617a8SJordan K. Hubbard * ilogb(inf/NaN) = 0x7fffffff (no signal is raised) 213a8617a8SJordan K. Hubbard */ 223a8617a8SJordan K. Hubbard 233a8617a8SJordan K. Hubbard #include "math.h" 243a8617a8SJordan K. Hubbard #include "math_private.h" 253a8617a8SJordan K. Hubbard 263a8617a8SJordan K. Hubbard #ifdef __STDC__ 273a8617a8SJordan K. Hubbard int ilogb(double x) 283a8617a8SJordan K. Hubbard #else 293a8617a8SJordan K. Hubbard int ilogb(x) 303a8617a8SJordan K. Hubbard double x; 313a8617a8SJordan K. Hubbard #endif 323a8617a8SJordan K. Hubbard { 333a8617a8SJordan K. Hubbard int32_t hx,lx,ix; 343a8617a8SJordan K. Hubbard 353a8617a8SJordan K. Hubbard EXTRACT_WORDS(hx,lx,x); 363a8617a8SJordan K. Hubbard hx &= 0x7fffffff; 373a8617a8SJordan K. Hubbard if(hx<0x00100000) { 383a8617a8SJordan K. Hubbard if((hx|lx)==0) 393a8617a8SJordan K. Hubbard return 0x80000001; /* ilogb(0) = 0x80000001 */ 403a8617a8SJordan K. Hubbard else /* subnormal x */ 413a8617a8SJordan K. Hubbard if(hx==0) { 423a8617a8SJordan K. Hubbard for (ix = -1043; lx>0; lx<<=1) ix -=1; 433a8617a8SJordan K. Hubbard } else { 443a8617a8SJordan K. Hubbard for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; 453a8617a8SJordan K. Hubbard } 463a8617a8SJordan K. Hubbard return ix; 473a8617a8SJordan K. Hubbard } 483a8617a8SJordan K. Hubbard else if (hx<0x7ff00000) return (hx>>20)-1023; 493a8617a8SJordan K. Hubbard else return 0x7fffffff; 503a8617a8SJordan K. Hubbard } 51