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 147f3dea24SPeter Wemm static char rcsid[] = "$FreeBSD$"; 153a8617a8SJordan K. Hubbard #endif 163a8617a8SJordan K. Hubbard 173a8617a8SJordan K. Hubbard /* ilogb(double x) 183a8617a8SJordan K. Hubbard * return the binary exponent of non-zero x 19552ebda9SStefan Farfeleder * ilogb(0) = FP_ILOGB0 20552ebda9SStefan Farfeleder * ilogb(NaN) = FP_ILOGBNAN (no signal is raised) 21552ebda9SStefan Farfeleder * ilogb(inf) = INT_MAX (no signal is raised) 223a8617a8SJordan K. Hubbard */ 233a8617a8SJordan K. Hubbard 24552ebda9SStefan Farfeleder #include <limits.h> 25552ebda9SStefan Farfeleder 263a8617a8SJordan K. Hubbard #include "math.h" 273a8617a8SJordan K. Hubbard #include "math_private.h" 283a8617a8SJordan K. Hubbard 293819e840SPeter Wemm int ilogb(double x) 303a8617a8SJordan K. Hubbard { 313a8617a8SJordan K. Hubbard int32_t hx,lx,ix; 323a8617a8SJordan K. Hubbard 333a8617a8SJordan K. Hubbard EXTRACT_WORDS(hx,lx,x); 343a8617a8SJordan K. Hubbard hx &= 0x7fffffff; 353a8617a8SJordan K. Hubbard if(hx<0x00100000) { 363a8617a8SJordan K. Hubbard if((hx|lx)==0) 37552ebda9SStefan Farfeleder return FP_ILOGB0; 383a8617a8SJordan K. Hubbard else /* subnormal x */ 393a8617a8SJordan K. Hubbard if(hx==0) { 403a8617a8SJordan K. Hubbard for (ix = -1043; lx>0; lx<<=1) ix -=1; 413a8617a8SJordan K. Hubbard } else { 423a8617a8SJordan K. Hubbard for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; 433a8617a8SJordan K. Hubbard } 443a8617a8SJordan K. Hubbard return ix; 453a8617a8SJordan K. Hubbard } 463a8617a8SJordan K. Hubbard else if (hx<0x7ff00000) return (hx>>20)-1023; 47552ebda9SStefan Farfeleder else if (hx>0x7ff00000 || lx!=0) return FP_ILOGBNAN; 48552ebda9SStefan Farfeleder else return INT_MAX; 493a8617a8SJordan K. Hubbard } 50