Bell 32V development
[unix-history] / usr / src / libm / sin.c
CommitLineData
94759b7b
TL
1/*
2 C program for floating point sin/cos.
3 Calls modf.
4 There are no error exits.
5 Coefficients are #3370 from Hart & Cheney (18.80D).
6*/
7
8static double twoopi = 0.63661977236758134308;
9static double p0 = .1357884097877375669092680e8;
10static double p1 = -.4942908100902844161158627e7;
11static double p2 = .4401030535375266501944918e6;
12static double p3 = -.1384727249982452873054457e5;
13static double p4 = .1459688406665768722226959e3;
14static double q0 = .8644558652922534429915149e7;
15static double q1 = .4081792252343299749395779e6;
16static double q2 = .9463096101538208180571257e4;
17static double q3 = .1326534908786136358911494e3;
18
19double
20cos(arg)
21double arg;
22{
23 double sinus();
24 if(arg<0)
25 arg = -arg;
26 return(sinus(arg, 1));
27}
28
29double
30sin(arg)
31double arg;
32{
33 double sinus();
34 return(sinus(arg, 0));
35}
36
37static double
38sinus(arg, quad)
39double arg;
40int quad;
41{
42 double modf();
43 double e, f;
44 double ysq;
45 double x,y;
46 int k;
47 double temp1, temp2;
48
49 x = arg;
50 if(x<0) {
51 x = -x;
52 quad = quad + 2;
53 }
54 x = x*twoopi; /*underflow?*/
55 if(x>32764){
56 y = modf(x,&e);
57 e = e + quad;
58 modf(0.25*e,&f);
59 quad = e - 4*f;
60 }else{
61 k = x;
62 y = x - k;
63 quad = (quad + k) & 03;
64 }
65 if (quad & 01)
66 y = 1-y;
67 if(quad > 1)
68 y = -y;
69
70 ysq = y*y;
71 temp1 = ((((p4*ysq+p3)*ysq+p2)*ysq+p1)*ysq+p0)*y;
72 temp2 = ((((ysq+q3)*ysq+q2)*ysq+q1)*ysq+q0);
73 return(temp1/temp2);
74}