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