diff options
| author | erdgeist <de@gsmk.de> | 2014-10-06 17:25:51 +0200 |
|---|---|---|
| committer | erdgeist <de@gsmk.de> | 2014-10-06 17:25:51 +0200 |
| commit | 798b2b1435fd2e6f4b51c55af219ff01c685db1d (patch) | |
| tree | e6f1a8b7295db2f5ff07041cee240e7ea378a66d | |
| parent | 927cbd1513cfcb0f0a50852c2d7a2c160fa3dc47 (diff) | |
Clean up table generator
| -rw-r--r-- | generate_table.c | 76 |
1 files changed, 67 insertions, 9 deletions
diff --git a/generate_table.c b/generate_table.c index c7a9d0c..9fd05bc 100644 --- a/generate_table.c +++ b/generate_table.c | |||
| @@ -6,6 +6,59 @@ | |||
| 6 | // s( 1) n(-4) off( 0) x = ( x << 4 ) | 6 | // s( 1) n(-4) off( 0) x = ( x << 4 ) |
| 7 | // s( 1) n( 8) off(-1) x = - x + ( x << 8 ) | 7 | // s( 1) n( 8) off(-1) x = - x + ( x << 8 ) |
| 8 | 8 | ||
| 9 | typedef enum { use_2pn, use_1_2pn, use_2pm_2pn, use_1_2pm_2pn } tr_flag; | ||
| 10 | typedef struct { | ||
| 11 | double factor; | ||
| 12 | int n; | ||
| 13 | int m; | ||
| 14 | int nsign; | ||
| 15 | tr_flag flag; | ||
| 16 | } table_record; | ||
| 17 | |||
| 18 | static int g_records; | ||
| 19 | static table_record g_tr[8192]; | ||
| 20 | |||
| 21 | static int compare_record( const void *a, const void *b ) { | ||
| 22 | if( ((table_record*)a)->factor > ((table_record*)b)->factor ) | ||
| 23 | return 1; | ||
| 24 | if( ((table_record*)a)->factor < ((table_record*)b)->factor ) | ||
| 25 | return -1; | ||
| 26 | return 0; | ||
| 27 | } | ||
| 28 | |||
| 29 | static void add_record( double v, int n, int nsign, int m, tr_flag flag ) | ||
| 30 | { | ||
| 31 | g_tr[g_records].factor = v; | ||
| 32 | g_tr[g_records].n = n; | ||
| 33 | g_tr[g_records].m = m; | ||
| 34 | g_tr[g_records].nsign = nsign; | ||
| 35 | g_tr[g_records].flag = flag; | ||
| 36 | ++g_records; | ||
| 37 | } | ||
| 38 | |||
| 39 | static void dump_record( int record ) | ||
| 40 | { | ||
| 41 | if( record >= g_records ) return; // should warn? | ||
| 42 | double factor = g_tr[record].factor; | ||
| 43 | int n = g_tr[record].n; | ||
| 44 | int m = g_tr[record].m; | ||
| 45 | int nsign = g_tr[record].nsign; | ||
| 46 | tr_flag flag = g_tr[record].flag; | ||
| 47 | |||
| 48 | switch( flag ) { | ||
| 49 | case use_2pn: | ||
| 50 | printf( "%0+25.21lf x = x %s %2d\n", factor, n>=0?"<<":">>", (int)abs(n) ); | ||
| 51 | break; | ||
| 52 | case use_1_2pn: | ||
| 53 | printf( "%0+25.21lf x%s= x %s %2d\n", factor, nsign==-1?"-":"+", n>=0?"<<":">>", (int)abs(n) ); | ||
| 54 | break; | ||
| 55 | case use_2pm_2pn: | ||
| 56 | case use_1_2pm_2pn: | ||
| 57 | printf( "%0+25.21lf x%s= ( x %s %2d ) %s ( x %s %2d )\n", factor, flag==use_2pm_2pn?" ":"-", m>=0?"<<":">>", (int)abs(m), nsign==-1?"-":"+", n>=0?"<<":">>", (int)abs(n)); | ||
| 58 | break; | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 9 | int main() { | 62 | int main() { |
| 10 | int n, m, nsign; | 63 | int n, m, nsign; |
| 11 | 64 | ||
| @@ -14,21 +67,26 @@ int main() { | |||
| 14 | for ( nsign=-1; nsign<=1; nsign+=2 ) | 67 | for ( nsign=-1; nsign<=1; nsign+=2 ) |
| 15 | { | 68 | { |
| 16 | // The one term only case | 69 | // The one term only case |
| 17 | double v = (double)nsign * pow( 2.f, (double)n ); | 70 | double v = (double)nsign * pow( 2., (double)n ); |
| 18 | if( v > 0.f ) | 71 | if( v > 0.0 ) |
| 19 | printf( "%0+25.21lf %08X x = %s ( x %s %2d )%s\n", log(v), abs((int)(67108864.f*log(v))), nsign==-1?"-":" ", n>=0?"<<":">>", (int)abs(n), " !RECOMMENDED!" ); | 72 | add_record( log(v), n, nsign, m, use_2pn ); |
| 20 | 73 | ||
| 21 | // Loop over second term | 74 | // Loop over second term |
| 22 | for (m=-31; m<=31; ++m ) | 75 | for (m=-31; m<=31; ++m ) |
| 23 | { | 76 | { |
| 24 | double v = pow( 2.f, (double)m ) + (double)nsign * pow( 2.f, (double)n ); | 77 | double v = pow( 2.0, (double)m ) + (double)nsign * pow( 2., (double)n ); |
| 25 | if( v > 0.f ) { | 78 | if( v <= 0.0 ) |
| 26 | printf( "%0+25.21lf %08X x = ( x %s %2d ) %s ( x %s %2d )%s\n", log(v), abs((int)(67108864.f*log(v))), m>=0?"<<":">>", (int)abs(m), nsign==-1?"-":"+", n>=0?"<<":">>", (int)abs(n), n*m?"":" !RECOMMENDED!" ); | 79 | continue; |
| 27 | if( v < 1.f ) | 80 | add_record( log(v), n, nsign, m, m ? use_2pm_2pn : use_1_2pn ); |
| 28 | printf( "%0+25.21lf %08X x-= ( x %s %2d ) %s ( x %s %2d )\n", log(1.0f - v), abs((int)(67108864.f*log(1.0f - v))), m>=0?"<<":">>", (int)abs(m), nsign==-1?"-":"+", n>=0?"<<":">>", (int)abs(n) ); | 81 | if( v < 1.0 ) |
| 29 | } | 82 | add_record( log(1.0 - v), n, nsign, m, use_1_2pm_2pn ); |
| 30 | } | 83 | } |
| 31 | } | 84 | } |
| 32 | 85 | ||
| 86 | qsort( g_tr, g_records, sizeof(*g_tr), compare_record ); | ||
| 87 | |||
| 88 | for (n=0; n<g_records; ++n ) | ||
| 89 | dump_record(n); | ||
| 90 | |||
| 33 | return 0; | 91 | return 0; |
| 34 | } | 92 | } |
