ack/lang/pc/libpc/atn.c

73 lines
1.3 KiB
C
Raw Permalink Normal View History

1984-07-20 10:44:57 +00:00
/*
* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*
* Author: Ceriel J.H. Jacobs
*/
1984-07-20 10:44:57 +00:00
1994-06-24 14:02:31 +00:00
/* $Id$ */
1989-06-19 16:22:23 +00:00
1988-07-25 11:40:57 +00:00
#define __NO_DEFS
#include <math.h>
1984-07-20 10:44:57 +00:00
2018-06-17 20:30:27 +00:00
#include "pc.h"
1990-11-06 13:02:55 +00:00
2018-06-17 20:30:27 +00:00
double _atn(double x)
{
1989-06-19 16:22:23 +00:00
/* Algorithm and coefficients from:
"Software manual for the elementary functions"
by W.J. Cody and W. Waite, Prentice-Hall, 1980
*/
1984-07-20 10:44:57 +00:00
1989-06-19 16:22:23 +00:00
static double p[] = {
-0.13688768894191926929e+2,
-0.20505855195861651981e+2,
-0.84946240351320683534e+1,
-0.83758299368150059274e+0
};
1989-06-19 16:22:23 +00:00
static double q[] = {
2018-06-17 14:11:29 +00:00
0.41066306682575781263e+2,
0.86157349597130242515e+2,
0.59578436142597344465e+2,
0.15024001160028576121e+2,
1.0
1989-06-19 16:22:23 +00:00
};
static double a[] = {
0.0,
2018-06-17 14:11:29 +00:00
0.52359877559829887307710723554658381, /* pi/6 */
1989-06-19 16:22:23 +00:00
M_PI_2,
2018-06-17 14:11:29 +00:00
1.04719755119659774615421446109316763 /* pi/3 */
};
1984-07-20 10:44:57 +00:00
2018-06-17 14:11:29 +00:00
int neg = x < 0;
int n;
double g;
1984-07-20 10:44:57 +00:00
2018-06-17 14:11:29 +00:00
if (neg)
{
x = -x;
}
2018-06-17 14:11:29 +00:00
if (x > 1.0)
{
x = 1.0 / x;
1989-06-19 16:22:23 +00:00
n = 2;
}
2018-06-17 14:11:29 +00:00
else
n = 0;
1984-07-20 10:44:57 +00:00
2018-06-17 14:11:29 +00:00
if (x > 0.26794919243112270647)
{ /* 2-sqtr(3) */
1989-06-19 16:22:23 +00:00
n = n + 1;
2018-06-17 14:11:29 +00:00
x = (((0.73205080756887729353 * x - 0.5) - 0.5) + x) / (1.73205080756887729353 + x);
}
1989-06-19 16:22:23 +00:00
/* ??? avoid underflow ??? */
g = x * x;
x += x * g * POLYNOM3(g, p) / POLYNOM4(g, q);
2018-06-17 14:11:29 +00:00
if (n > 1)
x = -x;
1989-06-19 16:22:23 +00:00
x += a[n];
return neg ? -x : x;
1984-07-20 10:44:57 +00:00
}