00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
#if defined(LIBM_SCCS) && !defined(lint)
00014
static char rcsid[] =
"$NetBSD: s_ilogb.c,v 1.9 1995/05/10 20:47:28 jtc Exp $";
00015
#endif
00016
00017
00018
00019
00020
00021
00022
00023
#include "math.h"
00024
#include "mathP.h"
00025
00026
#ifdef __STDC__
00027
int ilogb(
double x)
00028 #
else
00029 int ilogb(x)
00030 double x;
00031 #endif
00032 {
00033 int32_t hx,lx,ix;
00034
00035
GET_HIGH_WORD(hx,x);
00036 hx &= 0x7fffffff;
00037
if(hx<0x00100000) {
00038
GET_LOW_WORD(lx,x);
00039
if((hx|lx)==0)
00040
return 0x80000001;
00041
else
00042
if(hx==0) {
00043
for (ix = -1043; lx>0; lx<<=1) ix -=1;
00044 }
else {
00045
for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
00046 }
00047
return ix;
00048 }
00049
else if (hx<0x7ff00000) return (hx>>20)-1023;
00050
else return 0x7fffffff;
00051 }