13a8617a8SJordan K. Hubbard /* 23a8617a8SJordan K. Hubbard * ==================================================== 33a8617a8SJordan K. Hubbard * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 43a8617a8SJordan K. Hubbard * 53a8617a8SJordan K. Hubbard * Developed at SunPro, a Sun Microsystems, Inc. business. 63a8617a8SJordan K. Hubbard * Permission to use, copy, modify, and distribute this 73a8617a8SJordan K. Hubbard * software is freely granted, provided that this notice 83a8617a8SJordan K. Hubbard * is preserved. 93a8617a8SJordan K. Hubbard * ==================================================== 103a8617a8SJordan K. Hubbard */ 113a8617a8SJordan K. Hubbard 123a8617a8SJordan K. Hubbard /* ilogb(double x) 133a8617a8SJordan K. Hubbard * return the binary exponent of non-zero x 14552ebda9SStefan Farfeleder * ilogb(0) = FP_ILOGB0 15552ebda9SStefan Farfeleder * ilogb(NaN) = FP_ILOGBNAN (no signal is raised) 16552ebda9SStefan Farfeleder * ilogb(inf) = INT_MAX (no signal is raised) 173a8617a8SJordan K. Hubbard */ 183a8617a8SJordan K. Hubbard 19552ebda9SStefan Farfeleder #include <limits.h> 20552ebda9SStefan Farfeleder 213a8617a8SJordan K. Hubbard #include "math.h" 223a8617a8SJordan K. Hubbard #include "math_private.h" 233a8617a8SJordan K. Hubbard ilogb(double x)243819e840SPeter Wemm int ilogb(double x) 253a8617a8SJordan K. Hubbard { 263a8617a8SJordan K. Hubbard int32_t hx,lx,ix; 273a8617a8SJordan K. Hubbard 283a8617a8SJordan K. Hubbard EXTRACT_WORDS(hx,lx,x); 293a8617a8SJordan K. Hubbard hx &= 0x7fffffff; 303a8617a8SJordan K. Hubbard if(hx<0x00100000) { 313a8617a8SJordan K. Hubbard if((hx|lx)==0) 32552ebda9SStefan Farfeleder return FP_ILOGB0; 333a8617a8SJordan K. Hubbard else /* subnormal x */ 343a8617a8SJordan K. Hubbard if(hx==0) { 353a8617a8SJordan K. Hubbard for (ix = -1043; lx>0; lx<<=1) ix -=1; 363a8617a8SJordan K. Hubbard } else { 373a8617a8SJordan K. Hubbard for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; 383a8617a8SJordan K. Hubbard } 393a8617a8SJordan K. Hubbard return ix; 403a8617a8SJordan K. Hubbard } 413a8617a8SJordan K. Hubbard else if (hx<0x7ff00000) return (hx>>20)-1023; 42552ebda9SStefan Farfeleder else if (hx>0x7ff00000 || lx!=0) return FP_ILOGBNAN; 43552ebda9SStefan Farfeleder else return INT_MAX; 443a8617a8SJordan K. Hubbard } 45