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