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.
*/
#define cloop(TYPE) \
{\
TYPE *p1 = (TYPE *) in[0];\
TYPE *p2 = (TYPE *) in[1];\
TYPE *q = (TYPE *) out;\
\
for( x = 0; x < sz; x++ ) {\
double x1 = p1[0];\
double y1 = p1[1];\
double x2 = p2[0];\
double y2 = p2[1];\
\
double quot = x2 * x2 + y2 * y2;\
\
p1 += 2;\
p2 += 2;\
\
q[0] = (x1 * x2 + y1 * y2) / quot;\
q[1] = (y1 * x2 - x1 * y2) / quot;\
\
q += 2;\
}\
#ifdef USE_MODARG_DIV
/* This is going to be much slower */
#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 ){ \
double arg= atan2( X[1], X[0] ) - atan2( Y[1], Y[0] ); \
double mod= hypot( X[1], X[0] ) / hypot( Y[1], Y[0] ); \
*Z++= mod * cos( arg ); \
*Z++= mod * sin( arg ); \
} \
}
#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.
*/
#define rloop(TYPE) \