Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / cos.cpp
blobd6b6437cfc83b8e3b5a66a1a9c9b2058ea99872c
1 // Cosine function of numerical and symbolic arguments
3 #include "stdafx.h"
4 #include "defs.h"
6 void
7 eval_cos(void)
9 push(cadr(p1));
10 eval();
11 cosine();
14 void
15 cosine(void)
17 save();
18 p1 = pop();
19 if (car(p1) == symbol(ADD))
20 cosine_of_angle_sum();
21 else
22 cosine_of_angle();
23 restore();
26 // Use angle sum formula for special angles.
28 #define A p3
29 #define B p4
31 void
32 cosine_of_angle_sum(void)
34 p2 = cdr(p1);
35 while (iscons(p2)) {
36 B = car(p2);
37 if (isnpi(B)) {
38 push(p1);
39 push(B);
40 subtract();
41 A = pop();
42 push(A);
43 cosine();
44 push(B);
45 cosine();
46 multiply();
47 push(A);
48 sine();
49 push(B);
50 sine();
51 multiply();
52 subtract();
53 return;
55 p2 = cdr(p2);
57 cosine_of_angle();
60 void
61 cosine_of_angle(void)
63 int n;
64 double d;
66 if (car(p1) == symbol(ARCCOS)) {
67 push(cadr(p1));
68 return;
71 if (isdouble(p1)) {
72 d = cos(p1->u.d);
73 if (fabs(d) < 1e-10)
74 d = 0.0;
75 push_double(d);
76 return;
79 // cosine function is symmetric, cos(-x) = cos(x)
81 if (isnegative(p1)) {
82 push(p1);
83 negate();
84 p1 = pop();
87 // cos(arctan(x)) = 1 / sqrt(1 + x^2)
89 // see p. 173 of the CRC Handbook of Mathematical Sciences
91 if (car(p1) == symbol(ARCTAN)) {
92 push_integer(1);
93 push(cadr(p1));
94 push_integer(2);
95 power();
96 add();
97 push_rational(-1, 2);
98 power();
99 return;
102 // multiply by 180/pi
104 push(p1);
105 push_integer(180);
106 multiply();
107 push_symbol(PI);
108 divide();
110 n = pop_integer();
112 if (n < 0) {
113 push(symbol(COS));
114 push(p1);
115 list(2);
116 return;
119 switch (n % 360) {
120 case 90:
121 case 270:
122 push_integer(0);
123 break;
124 case 60:
125 case 300:
126 push_rational(1, 2);
127 break;
128 case 120:
129 case 240:
130 push_rational(-1, 2);
131 break;
132 case 45:
133 case 315:
134 push_rational(1, 2);
135 push_integer(2);
136 push_rational(1, 2);
137 power();
138 multiply();
139 break;
140 case 135:
141 case 225:
142 push_rational(-1, 2);
143 push_integer(2);
144 push_rational(1, 2);
145 power();
146 multiply();
147 break;
148 case 30:
149 case 330:
150 push_rational(1, 2);
151 push_integer(3);
152 push_rational(1, 2);
153 power();
154 multiply();
155 break;
156 case 150:
157 case 210:
158 push_rational(-1, 2);
159 push_integer(3);
160 push_rational(1, 2);
161 power();
162 multiply();
163 break;
164 case 0:
165 push_integer(1);
166 break;
167 case 180:
168 push_integer(-1);
169 break;
170 default:
171 push(symbol(COS));
172 push(p1);
173 list(2);
174 break;