From 74e85423c8431e32447806a44ff0a4b3ed1da195 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Sun, 5 Oct 2014 21:46:53 +0200 Subject: Initial version. Works. Untested. Unreviewed --- generate_table.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 generate_table.c (limited to 'generate_table.c') 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 @@ +#include +#include +#include + +// s(-1) n(14) off(+1) x = x - ( x >> 14 ) +// s( 1) n(-4) off( 0) x = ( x << 4 ) +// s( 1) n( 8) off(-1) x = - x + ( x << 8 ) + +int main() { + int n, m, nsign; + + // loop over all constructs in the form +-1*x^+-2n, n=-31..+31 + for (n=-31; n<= 31; ++n ) + for ( nsign=-1; nsign<=1; nsign+=2 ) + { + // The one term only case + double v = (double)nsign * pow( 2.f, (double)n ); + if( v > 0.f ) + 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!" ); + + // Loop over second term + for (m=-31; m<=31; ++m ) + { + double v = pow( 2.f, (double)m ) + (double)nsign * pow( 2.f, (double)n ); + if( v > 0.f ) { + 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!" ); + if( v < 1.f ) + 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) ); + } + } + } + + return 0; +} -- cgit v1.2.3