diff options
Diffstat (limited to 'generate_table.c')
| -rw-r--r-- | generate_table.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/generate_table.c b/generate_table.c new file mode 100644 index 0000000..c7a9d0c --- /dev/null +++ b/generate_table.c | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | #include <math.h> | ||
| 2 | #include <stdio.h> | ||
| 3 | #include <stdlib.h> | ||
| 4 | |||
| 5 | // s(-1) n(14) off(+1) x = x - ( x >> 14 ) | ||
| 6 | // s( 1) n(-4) off( 0) x = ( x << 4 ) | ||
| 7 | // s( 1) n( 8) off(-1) x = - x + ( x << 8 ) | ||
| 8 | |||
| 9 | int main() { | ||
| 10 | int n, m, nsign; | ||
| 11 | |||
| 12 | // loop over all constructs in the form +-1*x^+-2n, n=-31..+31 | ||
| 13 | for (n=-31; n<= 31; ++n ) | ||
| 14 | for ( nsign=-1; nsign<=1; nsign+=2 ) | ||
| 15 | { | ||
| 16 | // The one term only case | ||
| 17 | double v = (double)nsign * pow( 2.f, (double)n ); | ||
| 18 | if( v > 0.f ) | ||
| 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!" ); | ||
| 20 | |||
| 21 | // Loop over second term | ||
| 22 | for (m=-31; m<=31; ++m ) | ||
| 23 | { | ||
| 24 | double v = pow( 2.f, (double)m ) + (double)nsign * pow( 2.f, (double)n ); | ||
| 25 | if( v > 0.f ) { | ||
| 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!" ); | ||
| 27 | if( v < 1.f ) | ||
| 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) ); | ||
| 29 | } | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | return 0; | ||
| 34 | } | ||
