4.4BSD/usr/src/usr.bin/f77/libF77/pow_zi.c
/*-
* Copyright (c) 1980 The Regents of the University of California.
* All rights reserved.
*
* This module is believed to contain source code proprietary to AT&T.
* Use and redistribution is subject to the Berkeley Software License
* Agreement and your Software Agreement with AT&T (Western Electric).
*/
#ifndef lint
static char sccsid[] = "@(#)pow_zi.c 5.3 (Berkeley) 4/12/91";
#endif /* not lint */
#include "complex"
#define Z_MULEQ(A,B) \
t = (A).dreal * (B).dreal - (A).dimag * (B).dimag,\
(A).dimag = (A).dreal * (B).dimag + (A).dimag * (B).dreal,\
(A).dreal = t /* A *= B */
void
pow_zi(p, a, b) /* p = a**b */
dcomplex *p, *a;
long int *b;
{
register long n = *b;
double t;
dcomplex x;
x = *a;
p->dreal = (double)1, p->dimag = (double)0;
if (!n)
return;
if (n < 0) {
z_div(&x, p, a);
n = -n;
}
while (!(n&1)) {
Z_MULEQ(x, x);
n >>= 1;
}
for (*p = x; --n > 0; Z_MULEQ(*p, x))
while (!(n&1)) {
Z_MULEQ(x, x);
n >>= 1;
}
}