|
|
1.1 root 1: /*
2: * Copyright (c) 1987 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: *
17: * All recipients should regard themselves as participants in an ongoing
18: * research project and hence should feel obligated to report their
19: * experiences (good or bad) with these elementary function codes, using
20: * the sendbug(8) program, to the authors.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)sincos.c 5.3 (Berkeley) 6/30/88";
25: #endif /* not lint */
26:
27: #include "trig.h"
28: double
29: sin(x)
30: double x;
31: {
32: double a,c,z;
33:
34: if(!finite(x)) /* sin(NaN) and sin(INF) must be NaN */
35: return x-x;
36: x=drem(x,PI2); /* reduce x into [-PI,PI] */
37: a=copysign(x,one);
38: if (a >= PIo4) {
39: if(a >= PI3o4) /* ... in [3PI/4,PI] */
40: x = copysign((a = PI-a),x);
41: else { /* ... in [PI/4,3PI/4] */
42: a = PIo2-a; /* rtn. sign(x)*C(PI/2-|x|) */
43: z = a*a;
44: c = cos__C(z);
45: z *= half;
46: a = (z >= thresh ? half-((z-half)-c) : one-(z-c));
47: return copysign(a,x);
48: }
49: }
50:
51: if (a < small) { /* rtn. S(x) */
52: big+a;
53: return x;
54: }
55: return x+x*sin__S(x*x);
56: }
57:
58: double
59: cos(x)
60: double x;
61: {
62: double a,c,z,s = 1.0;
63:
64: if(!finite(x)) /* cos(NaN) and cos(INF) must be NaN */
65: return x-x;
66: x=drem(x,PI2); /* reduce x into [-PI,PI] */
67: a=copysign(x,one);
68: if (a >= PIo4) {
69: if (a >= PI3o4) { /* ... in [3PI/4,PI] */
70: a = PI-a;
71: s = negone;
72: }
73: else { /* ... in [PI/4,3PI/4] */
74: a = PIo2-a;
75: return a+a*sin__S(a*a); /* rtn. S(PI/2-|x|) */
76: }
77: }
78: if (a < small) {
79: big+a;
80: return s; /* rtn. s*C(a) */
81: }
82: z = a*a;
83: c = cos__C(z);
84: z *= half;
85: a = (z >= thresh ? half-((z-half)-c) : one-(z-c));
86: return copysign(a,s);
87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.