[base] Use rounding in CORDIC iterations.

* src/base/fttrigon.c (ft_trig_pseudo_rotate,
ft_trig_pseudo_polarize): Improve accuracy by rounding.
This commit is contained in:
Alexei Podtelezhnikov 2013-01-02 23:45:14 -05:00
parent b4ac30b0ed
commit 5dd9657fe8
2 changed files with 21 additions and 16 deletions

View File

@ -1,3 +1,10 @@
2013-01-02 Alexei Podtelezhnikov <apodtele@gmail.com>
[base] Use rounding in CORDIC iterations.
* src/base/fttrigon.c (ft_trig_pseudo_rotate,
ft_trig_pseudo_polarize): Improve accuracy by rounding.
2013-01-02 Alexei Podtelezhnikov <apodtele@gmail.com>
[base] Reduce trigonometric algorithms.

View File

@ -192,7 +192,7 @@
FT_Angle theta )
{
FT_Int i;
FT_Fixed x, y, xtemp;
FT_Fixed x, y, xtemp, b;
const FT_Fixed *arctanptr;
@ -219,24 +219,23 @@
arctanptr = ft_trig_arctan_table;
/* Pseudorotations, with right shifts */
i = 1;
do
for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
{
if ( theta < 0 )
{
xtemp = x + ( y >> i );
y = y - ( x >> i );
xtemp = x + ( ( y + b ) >> i );
y = y - ( ( x + b ) >> i );
x = xtemp;
theta += *arctanptr++;
}
else
{
xtemp = x - ( y >> i );
y = y + ( x >> i );
xtemp = x - ( ( y + b ) >> i );
y = y + ( ( x + b ) >> i );
x = xtemp;
theta -= *arctanptr++;
}
} while ( ++i < FT_TRIG_MAX_ITERS );
}
vec->x = x;
vec->y = y;
@ -248,7 +247,7 @@
{
FT_Angle theta;
FT_Int i;
FT_Fixed x, y, xtemp;
FT_Fixed x, y, xtemp, b;
const FT_Fixed *arctanptr;
@ -290,24 +289,23 @@
arctanptr = ft_trig_arctan_table;
/* Pseudorotations, with right shifts */
i = 1;
do
for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
{
if ( y > 0 )
{
xtemp = x + ( y >> i );
y = y - ( x >> i );
xtemp = x + ( ( y + b ) >> i );
y = y - ( ( x + b ) >> i );
x = xtemp;
theta += *arctanptr++;
}
else
{
xtemp = x - ( y >> i );
y = y + ( x >> i );
xtemp = x - ( ( y + b ) >> i );
y = y + ( ( x + b ) >> i );
x = xtemp;
theta -= *arctanptr++;
}
} while ( ++i < FT_TRIG_MAX_ITERS );
}
/* round theta */
if ( theta >= 0 )