00001
00002 c* (c) Copyright 2001-2002 Brown Deer Technology, LLC.
00003 c* All rights reserved.
00004
00005 subroutine ilog2( val, iresult )
00006 real val
00007 integer iresult
00008 integer i,imin,imax
00009 real absval,v,vmin,vmax
00010 real power2(-64:63)
00011 data
00012 & power2(-64) /5.42101086E-20/, power2(-63) /1.08420217E-19/,
00013 & power2(-62) /2.16840434E-19/, power2(-61) /4.33680869E-19/,
00014 & power2(-60) /8.67361738E-19/, power2(-59) /1.73472348E-18/,
00015 & power2(-58) /3.46944695E-18/, power2(-57) /6.9388939E-18/,
00016 & power2(-56) /1.38777878E-17/, power2(-55) /2.77555756E-17/,
00017 & power2(-54) /5.55111512E-17/, power2(-53) /1.11022302E-16/,
00018 & power2(-52) /2.22044605E-16/, power2(-51) /4.4408921E-16/,
00019 & power2(-50) /8.8817842E-16/, power2(-49) /1.77635684E-15/,
00020 & power2(-48) /3.55271368E-15/, power2(-47) /7.10542736E-15/,
00021 & power2(-46) /1.42108547E-14/, power2(-45) /2.84217094E-14/,
00022 & power2(-44) /5.68434189E-14/, power2(-43) /1.13686838E-13/,
00023 & power2(-42) /2.27373675E-13/, power2(-41) /4.54747351E-13/,
00024 & power2(-40) /9.09494702E-13/, power2(-39) /1.8189894E-12/,
00025 & power2(-38) /3.63797881E-12/, power2(-37) /7.27595761E-12/,
00026 & power2(-36) /1.45519152E-11/, power2(-35) /2.91038305E-11/,
00027 & power2(-34) /5.82076609E-11/, power2(-33) /1.16415322E-10/,
00028 & power2(-32) /2.32830644E-10/, power2(-31) /4.65661287E-10/,
00029 & power2(-30) /9.31322575E-10/, power2(-29) /1.86264515E-09/,
00030 & power2(-28) /3.7252903E-09/, power2(-27) /7.4505806E-09/,
00031 & power2(-26) /1.49011612E-08/, power2(-25) /2.98023224E-08/,
00032 & power2(-24) /5.96046448E-08/, power2(-23) /1.1920929E-07/,
00033 & power2(-22) /2.38418579E-07/, power2(-21) /4.76837158E-07/,
00034 & power2(-20) /9.53674316E-07/, power2(-19) /1.90734863E-06/,
00035 & power2(-18) /3.81469727E-06/, power2(-17) /7.62939453E-06/,
00036 & power2(-16) /1.52587891E-05/, power2(-15) /3.05175781E-05/,
00037 & power2(-14) /6.10351562E-05/, power2(-13) /0.000122070312/,
00038 & power2(-12) /0.000244140625/, power2(-11) /0.00048828125/,
00039 & power2(-10) /0.0009765625/, power2(-9) /0.001953125/,
00040 & power2(-8) /0.00390625/, power2(-7) /0.0078125/,
00041 & power2(-6) /0.015625/, power2(-5) /0.03125/,
00042 & power2(-4) /0.0625/, power2(-3) /0.125/,
00043 & power2(-2) /0.25/, power2(-1) /0.5/,
00044 & power2(0) /1./, power2(1) /2./,
00045 & power2(2) /4./, power2(3) /8./,
00046 & power2(4) /16./, power2(5) /32./,
00047 & power2(6) /64./, power2(7) /128./,
00048 & power2(8) /256./, power2(9) /512./,
00049 & power2(10) /1024./, power2(11) /2048./,
00050 & power2(12) /4096./, power2(13) /8192./,
00051 & power2(14) /16384./, power2(15) /32768./,
00052 & power2(16) /65536./, power2(17) /131072./,
00053 & power2(18) /262144./, power2(19) /524288./,
00054 & power2(20) /1048576./, power2(21) /2097152./,
00055 & power2(22) /4194304./, power2(23) /8388608./,
00056 & power2(24) /16777216./, power2(25) /33554432./,
00057 & power2(26) /67108864./, power2(27) /134217728./,
00058 & power2(28) /268435456./, power2(29) /536870912./,
00059 & power2(30) /1.07374182E+09/, power2(31) /2.14748365E+09/,
00060 & power2(32) /4.2949673E+09/, power2(33) /8.58993459E+09/,
00061 & power2(34) /1.71798692E+10/, power2(35) /3.43597384E+10/,
00062 & power2(36) /6.87194767E+10/, power2(37) /1.37438953E+11/,
00063 & power2(38) /2.74877907E+11/, power2(39) /5.49755814E+11/,
00064 & power2(40) /1.09951163E+12/, power2(41) /2.19902326E+12/,
00065 & power2(42) /4.39804651E+12/, power2(43) /8.79609302E+12/,
00066 & power2(44) /1.7592186E+13/, power2(45) /3.51843721E+13/,
00067 & power2(46) /7.03687442E+13/, power2(47) /1.40737488E+14/,
00068 & power2(48) /2.81474977E+14/, power2(49) /5.62949953E+14/,
00069 & power2(50) /1.12589991E+15/, power2(51) /2.25179981E+15/,
00070 & power2(52) /4.50359963E+15/, power2(53) /9.00719925E+15/,
00071 & power2(54) /1.80143985E+16/, power2(55) /3.6028797E+16/,
00072 & power2(56) /7.2057594E+16/, power2(57) /1.44115188E+17/,
00073 & power2(58) /2.88230376E+17/, power2(59) /5.76460752E+17/,
00074 & power2(60) /1.1529215E+18/, power2(61) /2.30584301E+18/,
00075 & power2(62) /4.61168602E+18/, power2(63) /9.22337204E+18/
00076
00077 imin = -64
00078 i = 0
00079 imax = 63
00080
00081 absval = abs(val)
00082
00083 vmin = 5.42101086E-20
00084 v = 1.
00085 vmax = 9.22337204E+18
00086
00087 if ( absval .ge. vmax ) then
00088 iresult = imax
00089 elseif ( absval .le. vmim ) then
00090 iresult = imin
00091 else
00092 do while ( imax-imin .gt. 1 )
00093 if ( absval .ge. v ) then
00094 imin = i
00095 vmin = v
00096 else
00097 imax = i
00098 vmax = v
00099 endif
00100 i=(imax+imin)/2
00101 v=power2(i)
00102 enddo
00103 iresult = imin
00104 endif
00105
00106 return
00107
00108 end
00109