[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.
This commit is contained in:
Alexei Podtelezhnikov 2013-01-10 22:29:07 -05:00
parent 4412e74de7
commit ad9d5c9726
2 changed files with 19 additions and 32 deletions

View File

@ -1,3 +1,14 @@
2013-01-10 Alexei Podtelezhnikov <apodtele@gmail.com>
[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 <apodtele@gmail.com>
[base, pshinter] Use FT_ABS, FT_MIN, and FT_MAX for readability.

View File

@ -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;
shift -= FT_TRIG_SAFE_MSB;
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 ) );
vec->x = x >> shift;
vec->y = y >> shift;
shift = -shift;
}
#endif /* 0 */
return shift;
}