diff --git a/ChangeLog b/ChangeLog index 6d2a672fb..0bc00b9a4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2013-01-10 Alexei Podtelezhnikov + + [base] Update the overflow protection bit. + + The recent optimizations of CORDIC iterations drastically reduce + the expansion factor. The vector components with MSB of 29 are now + safe from overflow. + + * src/base/fttrigon.c (FT_TRIG_SAFE_MSB): New macro. + (ft_trig_prenorm): Use it and remove dead code. + 2013-01-09 Alexei Podtelezhnikov [base, pshinter] Use FT_ABS, FT_MIN, and FT_MAX for readability. diff --git a/src/base/fttrigon.c b/src/base/fttrigon.c index a7ad02de7..ad6bc7281 100644 --- a/src/base/fttrigon.c +++ b/src/base/fttrigon.c @@ -40,7 +40,11 @@ /* the Cordic shrink factor 0.858785336480436 * 2^32 */ -#define FT_TRIG_SCALE 0xDBD95B16UL +#define FT_TRIG_SCALE 0xDBD95B16UL + + /* the highest bit in overflow-safe vectror components, + MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */ +#define FT_TRIG_SAFE_MSB 29 /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ #define FT_TRIG_MAX_ITERS 23 @@ -124,7 +128,6 @@ z = FT_ABS( x ) | FT_ABS( y ); shift = 0; -#if 1 /* determine msb bit index in `shift' */ if ( z >= ( 1L << 16 ) ) { @@ -152,47 +155,20 @@ shift += 1; } - if ( shift <= 27 ) + if ( shift <= FT_TRIG_SAFE_MSB ) { - shift = 27 - shift; + shift = FT_TRIG_SAFE_MSB - shift; vec->x = x << shift; vec->y = y << shift; } else { - shift -= 27; - vec->x = x >> shift; - vec->y = y >> shift; - shift = -shift; - } - -#else /* 0 */ - - if ( z < ( 1L << 27 ) ) - { - do - { - shift++; - z <<= 1; - } while ( z < ( 1L << 27 ) ); - vec->x = x << shift; - vec->y = y << shift; - } - else if ( z > ( 1L << 28 ) ) - { - do - { - shift++; - z >>= 1; - } while ( z > ( 1L << 28 ) ); - + shift -= FT_TRIG_SAFE_MSB; vec->x = x >> shift; vec->y = y >> shift; shift = -shift; } -#endif /* 0 */ - return shift; }