Metropoli BBS
VIEWER: power.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1996 by Thomas Glen Smith.  All Rights Reserved.*/
/* power APL2 V1.0.0 ***************************************************
* Called by powerx.                                                    *
* Power is a front-end to the standard library function pow().  X and Y*
* are its two arguments, and it returns the Yth power of X, according  *
* to the following rules:                                              *
* 1.  if absolute value of Y is less than FUZZ, return 1.0 regardless  *
*     of the value of x.                                               *
* 2.  X may be less than zero if Y is an approximation of a rational   *
*     number with an odd denominator.                                  *
***********************************************************************/
#define INCLUDES MATH
#include "includes.h"
double power(left,rite)
double left,rite;
{
	Dabs; Mod; Pow;
	extern int aplerr;
	extern double fuzz;
	double absdif,absleft,absrite,cur,den,dif,num,ret;
	int i;

	absrite = (rite >= 0.0) ? rite : -rite; /* absolute value */
	if (absrite <= fuzz) return(1.0);
	absleft = (left >= 0.0) ? left : -left; /* absolute value */
	if (mod(absrite,1.0) > fuzz)
		ret=pow(absleft,rite);
	else { /* right is approximate integer */
		i=absrite; /* convert to int. */
		ret=absleft;
		while(0<--i) ret *= absleft;
		if (rite < 0.0) ret = 1.0 / ret;
	}
	if (left < 0.0) { /* determine if denominator is odd */
		num = den = 1.0; /* start with 1/1 */
		for ( i = 0; i < 400; i++ ) {
			dif = rite - (cur = num / den);
			absdif = (dif >= 0.0) ? dif : -dif; /* absolute value */
			if (absdif <= fuzz) {
				if (mod(den,2.0) < fuzz) aplerr = 86;
				if (mod(num,2.0) < fuzz) return(ret);
				return(-ret);
			}
			if (rite > cur) num += 1.0;
			else den += 1.0;
		}
		aplerr = 87; /* bad exponent for negative number */
	}
	return(ret);
}
[ RETURN TO DIRECTORY ]