diff options
Diffstat (limited to 'contrib/libf2c/libF77/pow_zz.c')
-rw-r--r-- | contrib/libf2c/libF77/pow_zz.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/contrib/libf2c/libF77/pow_zz.c b/contrib/libf2c/libF77/pow_zz.c index 20faf29..d5cfbf3 100644 --- a/contrib/libf2c/libF77/pow_zz.c +++ b/contrib/libf2c/libF77/pow_zz.c @@ -1,23 +1,25 @@ #include "f2c.h" -#ifdef KR_headers -double log(), exp(), cos(), sin(), atan2(), f__cabs(); -VOID pow_zz(r,a,b) doublecomplex *r, *a, *b; -#else #undef abs #include <math.h> -extern double f__cabs(double,double); -void pow_zz(doublecomplex *r, doublecomplex *a, doublecomplex *b) -#endif +extern double f__cabs (double, double); +void +pow_zz (doublecomplex * r, doublecomplex * a, doublecomplex * b) { -double logr, logi, x, y; + double logr, logi, x, y; -logr = log( f__cabs(a->r, a->i) ); -logi = atan2(a->i, a->r); + if (a->r == 0.0 && a->i == 0.0) + { + /* Algorithm below doesn't cope. */ + r->r = r->i = 0.0; + return; + } + logr = log (f__cabs (a->r, a->i)); + logi = atan2 (a->i, a->r); -x = exp( logr * b->r - logi * b->i ); -y = logr * b->i + logi * b->r; + x = exp (logr * b->r - logi * b->i); + y = logr * b->i + logi * b->r; -r->r = x * cos(y); -r->i = x * sin(y); + r->r = x * cos (y); + r->i = x * sin (y); } |