summaryrefslogtreecommitdiffstats
path: root/contrib/libf2c/libF77/pow_zz.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libf2c/libF77/pow_zz.c')
-rw-r--r--contrib/libf2c/libF77/pow_zz.c30
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);
}
OpenPOWER on IntegriCloud