12116Sjkh/* @(#)s_ilogb.c 5.1 93/09/24 */ 22116Sjkh/* 32116Sjkh * ==================================================== 42116Sjkh * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 52116Sjkh * 62116Sjkh * Developed at SunPro, a Sun Microsystems, Inc. business. 72116Sjkh * Permission to use, copy, modify, and distribute this 88870Srgrimes * software is freely granted, provided that this notice 92116Sjkh * is preserved. 102116Sjkh * ==================================================== 112116Sjkh */ 122116Sjkh 13176451Sdas#include <sys/cdefs.h> 14176451Sdas__FBSDID("$FreeBSD$"); 152116Sjkh 162116Sjkh/* ilogb(double x) 172116Sjkh * return the binary exponent of non-zero x 18136332Sstefanf * ilogb(0) = FP_ILOGB0 19136332Sstefanf * ilogb(NaN) = FP_ILOGBNAN (no signal is raised) 20136332Sstefanf * ilogb(inf) = INT_MAX (no signal is raised) 212116Sjkh */ 222116Sjkh 23136332Sstefanf#include <limits.h> 24136332Sstefanf 252116Sjkh#include "math.h" 262116Sjkh#include "math_private.h" 272116Sjkh 28117912Speter int ilogb(double x) 292116Sjkh{ 302116Sjkh int32_t hx,lx,ix; 312116Sjkh 322116Sjkh EXTRACT_WORDS(hx,lx,x); 332116Sjkh hx &= 0x7fffffff; 342116Sjkh if(hx<0x00100000) { 358870Srgrimes if((hx|lx)==0) 36136332Sstefanf return FP_ILOGB0; 372116Sjkh else /* subnormal x */ 382116Sjkh if(hx==0) { 392116Sjkh for (ix = -1043; lx>0; lx<<=1) ix -=1; 402116Sjkh } else { 412116Sjkh for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; 422116Sjkh } 432116Sjkh return ix; 442116Sjkh } 452116Sjkh else if (hx<0x7ff00000) return (hx>>20)-1023; 46136332Sstefanf else if (hx>0x7ff00000 || lx!=0) return FP_ILOGBNAN; 47136332Sstefanf else return INT_MAX; 482116Sjkh} 49