#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; }