134127Sbostic /*
2*61282Sbostic * Copyright (c) 1987, 1993
3*61282Sbostic * The Regents of the University of California. All rights reserved.
434127Sbostic *
542653Sbostic * %sccs.include.redist.c%
631931Szliu */
731931Szliu
831931Szliu #ifndef lint
9*61282Sbostic static char sccsid[] = "@(#)sincos.c 8.1 (Berkeley) 06/04/93";
1034127Sbostic #endif /* not lint */
1131931Szliu
1231931Szliu #include "trig.h"
1331931Szliu double
sin(x)1431931Szliu sin(x)
1531931Szliu double x;
1631931Szliu {
1731931Szliu double a,c,z;
1831931Szliu
1931931Szliu if(!finite(x)) /* sin(NaN) and sin(INF) must be NaN */
2031931Szliu return x-x;
2131931Szliu x=drem(x,PI2); /* reduce x into [-PI,PI] */
2231931Szliu a=copysign(x,one);
2331931Szliu if (a >= PIo4) {
2431931Szliu if(a >= PI3o4) /* ... in [3PI/4,PI] */
2531931Szliu x = copysign((a = PI-a),x);
2631931Szliu else { /* ... in [PI/4,3PI/4] */
2731931Szliu a = PIo2-a; /* rtn. sign(x)*C(PI/2-|x|) */
2831931Szliu z = a*a;
2931931Szliu c = cos__C(z);
3031931Szliu z *= half;
3131931Szliu a = (z >= thresh ? half-((z-half)-c) : one-(z-c));
3231931Szliu return copysign(a,x);
3331931Szliu }
3431931Szliu }
3531931Szliu
3631931Szliu if (a < small) { /* rtn. S(x) */
3731931Szliu big+a;
3831931Szliu return x;
3931931Szliu }
4031931Szliu return x+x*sin__S(x*x);
4131931Szliu }
4231931Szliu
4331931Szliu double
cos(x)4431931Szliu cos(x)
4531931Szliu double x;
4631931Szliu {
4731931Szliu double a,c,z,s = 1.0;
4831931Szliu
4931931Szliu if(!finite(x)) /* cos(NaN) and cos(INF) must be NaN */
5031931Szliu return x-x;
5131931Szliu x=drem(x,PI2); /* reduce x into [-PI,PI] */
5231931Szliu a=copysign(x,one);
5331931Szliu if (a >= PIo4) {
5431931Szliu if (a >= PI3o4) { /* ... in [3PI/4,PI] */
5531931Szliu a = PI-a;
5631931Szliu s = negone;
5731931Szliu }
5831931Szliu else { /* ... in [PI/4,3PI/4] */
5931931Szliu a = PIo2-a;
6031931Szliu return a+a*sin__S(a*a); /* rtn. S(PI/2-|x|) */
6131931Szliu }
6231931Szliu }
6331931Szliu if (a < small) {
6431931Szliu big+a;
6531931Szliu return s; /* rtn. s*C(a) */
6631931Szliu }
6731931Szliu z = a*a;
6831931Szliu c = cos__C(z);
6931931Szliu z *= half;
7031931Szliu a = (z >= thresh ? half-((z-half)-c) : one-(z-c));
7131931Szliu return copysign(a,s);
7231931Szliu }
73