Metropoli BBS
VIEWER: circulap.c MODE: TEXT (ASCII)
/* Copyright (C) 1994, 1998 by Thomas Glen Smith.  All Rights Reserved. */
/* circulap APL2 V1.0.1 ************************************************
* Implementation of the APL circular, hyperbolic, and Pythagorean      *
* functions.                                                           *
***********************************************************************/
#define INCLUDES MATH
#include "includes.h"
void circulap(left,rite,ret)
double *left,*rite,*ret;
{
	Acosh; Asinh; Atanh; Sqrt;
	extern int aplerr;
	extern double fuzz;
	double wrk;
	int ii;

	wrk = *rite;
	switch (ii = *left) {
		case -7: *ret = atanh(wrk); break;
		case -6: *ret = acosh(wrk); break;
		case -5: *ret = asinh(wrk); break;
		case -4: *ret = (sqrt(-1.0+wrk*wrk)); break;
		case -3: *ret = (atan(wrk)); /* Arctan */ break;
		case -2: /* Arccos */
		case -1: /* Arcsin */
			if (wrk > 1.0) {
				if ((wrk - 1.0) < fuzz) wrk = 1.0;
			} else if (*rite < -1.0) {
				if ((wrk + 1.0) < fuzz) wrk = -1.0;
			}
			*ret = (ii == -2) ? acos(wrk): asin(wrk);
			break;
		case  0: *ret = (sqrt(1-wrk*wrk)); break;
		case  1: *ret = (sin(wrk)); /* Sine */ break;
		case  2: *ret = (cos(wrk)); /* Cosine */ break;
		case  3: *ret = (tan(wrk)); /* Tangent */ break;
		case  4: *ret = (sqrt(1.0+wrk*wrk)); break;
		case  5: *ret = (sinh(wrk)); /* Hyperbolic sine */ break;
		case  6: *ret = (cosh(wrk)); /* Hyperbolic cosine */ break;
		case  7: *ret = (tanh(*rite)); /* Hyperbolic tangent */ break;
		default: aplerr = 85; *ret = (0.0); /* *left invalid */ break;
	} /* end switch */
}
[ RETURN TO DIRECTORY ]