UNPKG

2.33 kBtext/coffeescriptView Raw
1### arcsin =====================================================================
2
3Tags
4----
5scripting, JS, internal, treenode, general concept
6
7Parameters
8----------
9x
10
11General description
12-------------------
13Returns the inverse sine of x.
14
15###
16
17Eval_arcsin = ->
18 push(cadr(p1))
19 Eval()
20 arcsin()
21
22arcsin = ->
23 n = 0
24 d = 0
25
26 save()
27
28 p1 = pop()
29
30 if (car(p1) == symbol(SIN))
31 push(cadr(p1))
32 restore()
33 return
34
35 if (isdouble(p1))
36 errno = 0
37 d = Math.asin(p1.d)
38 if (errno)
39 stop("arcsin function argument is not in the interval [-1,1]")
40 push_double(d)
41 restore()
42 return
43
44 # if p1 == 1/sqrt(2) then return 1/4*pi (45 degrees)
45 # second if catches the other way of saying it, sqrt(2)/2
46
47 if (isoneoversqrttwo(p1)) or
48 (car(p1) == symbol(MULTIPLY) && equalq(car(cdr(p1)), 1,2) and car(car(cdr(cdr(p1)))) == symbol(POWER) && equaln(car(cdr(car(cdr(cdr(p1))))),2) && equalq(car(cdr(cdr(car(cdr(cdr(p1)))))), 1, 2))
49 push_rational(1, 4)
50 push_symbol(PI)
51 multiply()
52 restore()
53 return
54
55 # if p1 == -1/sqrt(2) then return -1/4*pi (-45 degrees)
56 # second if catches the other way of saying it, -sqrt(2)/2
57
58 if (isminusoneoversqrttwo(p1)) or
59 (car(p1) == symbol(MULTIPLY) && equalq(car(cdr(p1)), -1,2) and car(car(cdr(cdr(p1)))) == symbol(POWER) && equaln(car(cdr(car(cdr(cdr(p1))))),2) && equalq(car(cdr(cdr(car(cdr(cdr(p1)))))), 1, 2))
60 if evaluatingAsFloats
61 push_double(-Math.PI / 4.0)
62 else
63 push_rational(-1, 4)
64 push_symbol(PI)
65 multiply()
66 restore()
67 return
68
69 if (!isrational(p1))
70 push_symbol(ARCSIN)
71 push(p1)
72 list(2)
73 restore()
74 return
75
76 push(p1)
77 push_integer(2)
78 multiply()
79 n = pop_integer()
80
81 switch (n)
82
83 when -2
84 if evaluatingAsFloats
85 push_double(-Math.PI / 2.0)
86 else
87 push_rational(-1, 2)
88 push_symbol(PI)
89 multiply()
90
91 when -1
92 if evaluatingAsFloats
93 push_double(-Math.PI / 6.0)
94 else
95 push_rational(-1, 6)
96 push_symbol(PI)
97 multiply()
98
99 when 0
100 if evaluatingAsFloats
101 push_double(0.0)
102 else
103 push(zero)
104
105 when 1
106 if evaluatingAsFloats
107 push_double(Math.PI / 6.0)
108 else
109 push_rational(1, 6)
110 push_symbol(PI)
111 multiply()
112
113 when 2
114 if evaluatingAsFloats
115 push_double(Math.PI / 2.0)
116 else
117 push_rational(1, 2)
118 push_symbol(PI)
119 multiply()
120
121 else
122 push_symbol(ARCSIN)
123 push(p1)
124 list(2)
125
126 restore()
127
128
129