xref: /csrg-svn/lib/libm/common/sincos.c (revision 61282)
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