Mercurial > hg > aim92
annotate filter/imb.c @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
rev | line source |
---|---|
tomwalters@0 | 1 /* |
tomwalters@0 | 2 imb.c |
tomwalters@0 | 3 ===== |
tomwalters@0 | 4 |
tomwalters@0 | 5 integer version of logarithms using units of milliBells. |
tomwalters@0 | 6 |
tomwalters@0 | 7 */ |
tomwalters@0 | 8 |
tomwalters@0 | 9 #include <math.h> |
tomwalters@0 | 10 |
tomwalters@0 | 11 #include "stitch.h" |
tomwalters@0 | 12 |
tomwalters@0 | 13 #define LOG_ZERO (-10) |
tomwalters@0 | 14 |
tomwalters@0 | 15 int imB( number ) |
tomwalters@0 | 16 long number ; |
tomwalters@0 | 17 { |
tomwalters@0 | 18 register int i, out ; |
tomwalters@0 | 19 register long in ; |
tomwalters@0 | 20 static int precision = 12 ; |
tomwalters@0 | 21 static int *table = { ( int * ) 0 } ; |
tomwalters@0 | 22 static unsigned table_size ; |
tomwalters@0 | 23 static int inc ; |
tomwalters@0 | 24 double k ; |
tomwalters@0 | 25 |
tomwalters@0 | 26 if( table == ( int * ) 0 ) { |
tomwalters@0 | 27 |
tomwalters@0 | 28 table_size = 1 << precision ; |
tomwalters@0 | 29 |
tomwalters@0 | 30 k = 2000. / log( 10. ) ; |
tomwalters@0 | 31 inc = k * log( 2. ) + 0.5 ; |
tomwalters@0 | 32 |
tomwalters@0 | 33 table = (int *) stitch_malloc( table_size * sizeof( *table ), "imb.c for log table" ) ; |
tomwalters@0 | 34 |
tomwalters@0 | 35 for( i=0 ; i < table_size ; i++ ) |
tomwalters@0 | 36 table[ i ] = log( (double) ( table_size + i ) / table_size ) * k + 0.5 ; |
tomwalters@0 | 37 } |
tomwalters@0 | 38 |
tomwalters@0 | 39 if( number > 0 ) { |
tomwalters@0 | 40 |
tomwalters@0 | 41 in = number ; |
tomwalters@0 | 42 |
tomwalters@0 | 43 out = precision * inc ; |
tomwalters@0 | 44 |
tomwalters@0 | 45 if( number < table_size ) |
tomwalters@0 | 46 do { |
tomwalters@0 | 47 in <<= 1 ; |
tomwalters@0 | 48 out -= inc ; |
tomwalters@0 | 49 } |
tomwalters@0 | 50 while( in < table_size ) ; |
tomwalters@0 | 51 else |
tomwalters@0 | 52 while( in - table_size >= table_size ) { |
tomwalters@0 | 53 in >>= 1 ; |
tomwalters@0 | 54 out += inc ; |
tomwalters@0 | 55 } |
tomwalters@0 | 56 |
tomwalters@0 | 57 return( out + table[ in - table_size ] ) ; |
tomwalters@0 | 58 } |
tomwalters@0 | 59 else |
tomwalters@0 | 60 return ( LOG_ZERO ) ; |
tomwalters@0 | 61 } |
tomwalters@0 | 62 |