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 }