UNPKG

1.95 kBtext/coffeescriptView Raw
1### arctan =====================================================================
2
3Tags
4----
5scripting, JS, internal, treenode, general concept
6
7Parameters
8----------
9x
10
11General description
12-------------------
13Returns the inverse tangent of x.
14
15###
16
17Eval_arctan = ->
18 push(cadr(p1))
19 Eval()
20 arctan()
21
22arctan = ->
23 d = 0
24
25 save()
26
27 p1 = pop()
28
29 if (car(p1) == symbol(TAN))
30 push(cadr(p1))
31 restore()
32 return
33
34 if (isdouble(p1))
35 errno = 0
36 d = Math.atan(p1.d)
37 if (errno)
38 stop("arctan function error")
39 push_double(d)
40 restore()
41 return
42
43 if (iszero(p1))
44 push(zero)
45 restore()
46 return
47
48 if (isnegative(p1))
49 push(p1)
50 negate()
51 arctan()
52 negate()
53 restore()
54 return
55
56 # arctan(sin(a) / cos(a)) ?
57
58 if (Find(p1, symbol(SIN)) && Find(p1, symbol(COS)))
59 push(p1)
60 numerator()
61 p2 = pop()
62 push(p1)
63 denominator()
64 p3 = pop()
65 if (car(p2) == symbol(SIN) && car(p3) == symbol(COS) && equal(cadr(p2), cadr(p3)))
66 push(cadr(p2))
67 restore()
68 return
69
70 # arctan(1/sqrt(3)) -> pi/6
71 # second if catches the other way of saying it, sqrt(3)/3
72
73 if (car(p1) == symbol(POWER) && equaln(cadr(p1), 3) && equalq(caddr(p1), -1, 2)) or
74 (car(p1) == symbol(MULTIPLY) && equalq(car(cdr(p1)), 1,3) and car(car(cdr(cdr(p1)))) == symbol(POWER) && equaln(car(cdr(car(cdr(cdr(p1))))),3) && equalq(car(cdr(cdr(car(cdr(cdr(p1)))))), 1, 2))
75 push_rational(1, 6)
76 if evaluatingAsFloats
77 push_double(Math.PI)
78 else
79 push(symbol(PI))
80 multiply()
81 restore()
82 return
83
84 # arctan(1) -> pi/4
85
86 if (equaln(p1, 1))
87 push_rational(1, 4)
88 if evaluatingAsFloats
89 push_double(Math.PI)
90 else
91 push(symbol(PI))
92 multiply()
93 restore()
94 return
95
96 # arctan(sqrt(3)) -> pi/3
97
98 if (car(p1) == symbol(POWER) && equaln(cadr(p1), 3) && equalq(caddr(p1), 1, 2))
99 push_rational(1, 3)
100 if evaluatingAsFloats
101 push_double(Math.PI)
102 else
103 push(symbol(PI))
104 multiply()
105 restore()
106 return
107
108 push_symbol(ARCTAN)
109 push(p1)
110 list(2)
111
112 restore()
113
114