4.4BSD/usr/src/usr.bin/f77/libF77/pow_di.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_di.c 5.4 (Berkeley) 4/12/91";
#endif /* not lint */
double
pow_di(ap, bp)
double *ap;
long *bp;
{
register long n = *bp;
double y, x = *ap;
if (!n)
return((double)1);
if (n < 0) {
x = (double)1 / x;
n = -n;
}
while (!(n&1)) {
x *= x;
n >>= 1;
}
for (y = x; --n > 0; y *= x)
while (!(n&1)) {
x *= x;
n >>= 1;
}
return(y);
}