Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / arcsin.cpp
blob53301ca81224befab37838158394fa46e2b7fd38
1 #include "stdafx.h"
2 #include "defs.h"
4 void
5 eval_arcsin(void)
7 push(cadr(p1));
8 eval();
9 arcsin();
12 void
13 arcsin(void)
15 int n;
16 double d;
18 save();
20 p1 = pop();
22 if (car(p1) == symbol(SIN)) {
23 push(cadr(p1));
24 restore();
25 return;
28 if (isdouble(p1)) {
29 errno = 0;
30 d = asin(p1->u.d);
31 if (errno)
32 stop("arcsin function argument is not in the interval [-1,1]");
33 push_double(d);
34 restore();
35 return;
38 // if p1 == 1/sqrt(2) then return 1/4*pi (45 degrees)
40 if (isoneoversqrttwo(p1)) {
41 push_rational(1, 4);
42 push_symbol(PI);
43 multiply();
44 restore();
45 return;
48 // if p1 == -1/sqrt(2) then return -1/4*pi (-45 degrees)
50 if (isminusoneoversqrttwo(p1)) {
51 push_rational(-1, 4);
52 push_symbol(PI);
53 multiply();
54 restore();
55 return;
58 if (!isrational(p1)) {
59 push_symbol(ARCSIN);
60 push(p1);
61 list(2);
62 restore();
63 return;
66 push(p1);
67 push_integer(2);
68 multiply();
69 n = pop_integer();
71 switch (n) {
73 case -2:
74 push_rational(-1, 2);
75 push_symbol(PI);
76 multiply();
77 break;
79 case -1:
80 push_rational(-1, 6);
81 push_symbol(PI);
82 multiply();
83 break;
85 case 0:
86 push(zero);
87 break;
89 case 1:
90 push_rational(1, 6);
91 push_symbol(PI);
92 multiply();
93 break;
95 case 2:
96 push_rational(1, 2);
97 push_symbol(PI);
98 multiply();
99 break;
101 default:
102 push_symbol(ARCSIN);
103 push(p1);
104 list(2);
105 break;
108 restore();