/*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); }