1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | Eval_arcsin = ->
|
18 | push(cadr(p1))
|
19 | Eval()
|
20 | arcsin()
|
21 |
|
22 | arcsin = ->
|
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 |
|
45 |
|
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 |
|
56 |
|
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 |
|