fix type overflow in complex division

This commit is contained in:
John Cupitt 2008-02-04 11:10:45 +00:00
parent b08022e47a
commit 68328c9647
1 changed files with 42 additions and 22 deletions

View File

@ -80,30 +80,50 @@
/* Complex divide. /* Complex divide.
*/ */
#define cloop(TYPE) \ #ifdef USE_MODARG_DIV
{\ /* This is going to be much slower */
TYPE *p1 = (TYPE *) in[0];\
TYPE *p2 = (TYPE *) in[1];\ #define cloop(TYPE) \
TYPE *q = (TYPE *) out;\ { \
\ TYPE *X= (TYPE*) in[0]; \
for( x = 0; x < sz; x++ ) {\ TYPE *Y= (TYPE*) in[1]; \
double x1 = p1[0];\ TYPE *Z= (TYPE*) out; \
double y1 = p1[1];\ TYPE *Z_stop= Z + sz * 2; \
double x2 = p2[0];\ \
double y2 = p2[1];\ for( ; Z < Z_stop; X+= 2, Y+=2 ){ \
\ double arg= atan2( X[1], X[0] ) - atan2( Y[1], Y[0] ); \
double quot = x2 * x2 + y2 * y2;\ double mod= hypot( X[1], X[0] ) / hypot( Y[1], Y[0] ); \
\ *Z++= mod * cos( arg ); \
p1 += 2;\ *Z++= mod * sin( arg ); \
p2 += 2;\ } \
\
q[0] = (x1 * x2 + y1 * y2) / quot;\
q[1] = (y1 * x2 - x1 * y2) / quot;\
\
q += 2;\
}\
} }
#else /* USE_MODARG_DIV */
#define cloop(TYPE) \
{ \
TYPE *X= (TYPE*) in[0]; \
TYPE *Y= (TYPE*) in[1]; \
TYPE *Z= (TYPE*) out; \
TYPE *Z_stop= Z + sz * 2; \
\
for( ; Z < Z_stop; X+= 2, Y+=2 ) \
if( fabs( Y[0] ) > fabs( Y[1] )){ \
double a= Y[1] / Y[0]; \
double b= Y[0] + Y[1] * a; \
*Z++= ( X[0] + X[1] * a ) / b; \
*Z++= ( X[1] - X[0] * a ) / b; \
} \
else { \
double a= Y[0] / Y[1]; \
double b= Y[1] + Y[0] * a; \
*Z++= ( X[0] * a + X[1] ) / b; \
*Z++= ( X[1] * a - X[0] ) / b; \
} \
}
#endif /* USE_MODARG_DIV */
/* Real divide. /* Real divide.
*/ */
#define rloop(TYPE) \ #define rloop(TYPE) \