diff options
Diffstat (limited to 'contrib/libf2c/libF77/pow_zi.c')
-rw-r--r-- | contrib/libf2c/libF77/pow_zi.c | 87 |
1 files changed, 47 insertions, 40 deletions
diff --git a/contrib/libf2c/libF77/pow_zi.c b/contrib/libf2c/libF77/pow_zi.c index abb3cb2b5302..898ea6be917b 100644 --- a/contrib/libf2c/libF77/pow_zi.c +++ b/contrib/libf2c/libF77/pow_zi.c @@ -1,54 +1,61 @@ #include "f2c.h" #ifdef KR_headers -VOID pow_zi(p, a, b) /* p = a**b */ - doublecomplex *p, *a; integer *b; +VOID pow_zi(resx, a, b) /* p = a**b */ + doublecomplex *resx, *a; integer *b; #else extern void z_div(doublecomplex*, doublecomplex*, doublecomplex*); -void pow_zi(doublecomplex *p, doublecomplex *a, integer *b) /* p = a**b */ +void pow_zi(doublecomplex *resx, doublecomplex *a, integer *b) /* p = a**b */ #endif { - integer n; - unsigned long u; - double t; - doublecomplex q, x; - static doublecomplex one = {1.0, 0.0}; +integer n; +unsigned long u; +double t; +doublecomplex x; +doublecomplex res; +static doublecomplex one = {1.0, 0.0}; - n = *b; - q.r = 1; - q.i = 0; +n = *b; - if(n == 0) - goto done; - if(n < 0) - { - n = -n; - z_div(&x, &one, a); - } - else +if(n == 0) + { + resx->r = 1; + resx->i = 0; + return; + } + +res.r = 1; +res.i = 0; + +if(n < 0) + { + n = -n; + z_div(&x, &one, a); + } +else + { + x.r = a->r; + x.i = a->i; + } + +for(u = n; ; ) + { + if(u & 01) { - x.r = a->r; - x.i = a->i; + t = res.r * x.r - res.i * x.i; + res.i = res.r * x.i + res.i * x.r; + res.r = t; } - - for(u = n; ; ) + if(u >>= 1) { - if(u & 01) - { - t = q.r * x.r - q.i * x.i; - q.i = q.r * x.i + q.i * x.r; - q.r = t; - } - if(u >>= 1) - { - t = x.r * x.r - x.i * x.i; - x.i = 2 * x.r * x.i; - x.r = t; - } - else - break; + t = x.r * x.r - x.i * x.i; + x.i = 2 * x.r * x.i; + x.r = t; } - done: - p->i = q.i; - p->r = q.r; + else + break; } + +resx->r = res.r; +resx->i = res.i; +} |