*** empty log message ***
This commit is contained in:
parent
9ea20b81b1
commit
ae0723c1bc
4 changed files with 109 additions and 16 deletions
47
arccos.cpp
47
arccos.cpp
|
@ -6,22 +6,27 @@ eval_arccos(void)
|
|||
{
|
||||
push(cadr(p1));
|
||||
eval();
|
||||
arccos();
|
||||
yyarccos();
|
||||
}
|
||||
|
||||
void
|
||||
arccos(void)
|
||||
{
|
||||
save();
|
||||
yyarccos();
|
||||
restore();
|
||||
}
|
||||
|
||||
void
|
||||
yyarccos(void)
|
||||
{
|
||||
int n;
|
||||
double d;
|
||||
|
||||
save();
|
||||
|
||||
p1 = pop();
|
||||
|
||||
if (car(p1) == symbol(COS)) {
|
||||
push(cadr(p1));
|
||||
restore();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -31,7 +36,24 @@ arccos(void)
|
|||
if (errno)
|
||||
stop("arccos function argument is not in the interval [-1,1]");
|
||||
push_double(d);
|
||||
restore();
|
||||
return;
|
||||
}
|
||||
|
||||
// if p1 == 1/sqrt(2) then return 1/4*pi (45 degrees)
|
||||
|
||||
if (issqrttwo(p1)) {
|
||||
push_rational(1, 4);
|
||||
push_symbol(PI);
|
||||
multiply();
|
||||
return;
|
||||
}
|
||||
|
||||
// if p1 == -1/sqrt(2) then return 3/4*pi (135 degrees)
|
||||
|
||||
if (isminussqrttwo(p1)) {
|
||||
push_rational(3, 4);
|
||||
push_symbol(PI);
|
||||
multiply();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -39,7 +61,6 @@ arccos(void)
|
|||
push_symbol(ARCCOS);
|
||||
push(p1);
|
||||
list(2);
|
||||
restore();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -82,8 +103,6 @@ arccos(void)
|
|||
list(2);
|
||||
break;
|
||||
}
|
||||
|
||||
restore();
|
||||
}
|
||||
|
||||
static char *s[] = {
|
||||
|
@ -120,6 +139,18 @@ static char *s[] = {
|
|||
|
||||
"arccos(cos(x))",
|
||||
"x",
|
||||
|
||||
"arccos(1/sqrt(2))",
|
||||
"1/4*pi",
|
||||
|
||||
"arccos(-1/sqrt(2))",
|
||||
"3/4*pi",
|
||||
|
||||
"arccos(cos(1/4*pi))",
|
||||
"1/4*pi",
|
||||
|
||||
"arccos(cos(3/4*pi))",
|
||||
"3/4*pi",
|
||||
};
|
||||
|
||||
void
|
||||
|
|
47
arcsin.cpp
47
arcsin.cpp
|
@ -6,22 +6,27 @@ eval_arcsin(void)
|
|||
{
|
||||
push(cadr(p1));
|
||||
eval();
|
||||
arcsin();
|
||||
yyarcsin();
|
||||
}
|
||||
|
||||
void
|
||||
arcsin(void)
|
||||
{
|
||||
save();
|
||||
yyarcsin();
|
||||
restore();
|
||||
}
|
||||
|
||||
void
|
||||
yyarcsin(void)
|
||||
{
|
||||
int n;
|
||||
double d;
|
||||
|
||||
save();
|
||||
|
||||
p1 = pop();
|
||||
|
||||
if (car(p1) == symbol(SIN)) {
|
||||
push(cadr(p1));
|
||||
restore();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -31,7 +36,24 @@ arcsin(void)
|
|||
if (errno)
|
||||
stop("arcsin function argument is not in the interval [-1,1]");
|
||||
push_double(d);
|
||||
restore();
|
||||
return;
|
||||
}
|
||||
|
||||
// if p1 == 1/sqrt(2) then return 1/4*pi (45 degrees)
|
||||
|
||||
if (issqrttwo(p1)) {
|
||||
push_rational(1, 4);
|
||||
push_symbol(PI);
|
||||
multiply();
|
||||
return;
|
||||
}
|
||||
|
||||
// if p1 == -1/sqrt(2) then return -1/4*pi (-45 degrees)
|
||||
|
||||
if (isminussqrttwo(p1)) {
|
||||
push_rational(-1, 4);
|
||||
push_symbol(PI);
|
||||
multiply();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -39,7 +61,6 @@ arcsin(void)
|
|||
push_symbol(ARCSIN);
|
||||
push(p1);
|
||||
list(2);
|
||||
restore();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -84,8 +105,6 @@ arcsin(void)
|
|||
list(2);
|
||||
break;
|
||||
}
|
||||
|
||||
restore();
|
||||
}
|
||||
|
||||
static char *s[] = {
|
||||
|
@ -122,6 +141,18 @@ static char *s[] = {
|
|||
|
||||
"arcsin(sin(x))",
|
||||
"x",
|
||||
|
||||
"arcsin(1/sqrt(2))",
|
||||
"1/4*pi",
|
||||
|
||||
"arcsin(-1/sqrt(2))",
|
||||
"-1/4*pi",
|
||||
|
||||
"arcsin(sin(1/4*pi))",
|
||||
"1/4*pi",
|
||||
|
||||
"arcsin(sin(-1/4*pi))",
|
||||
"-1/4*pi",
|
||||
};
|
||||
|
||||
void
|
||||
|
|
27
is.cpp
27
is.cpp
|
@ -304,3 +304,30 @@ equalq(U *p, int a, int b)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// p == 1/sqrt(2) ?
|
||||
|
||||
int
|
||||
issqrttwo(U *p)
|
||||
{
|
||||
if (car(p) == symbol(POWER)
|
||||
&& equaln(cadr(p), 2)
|
||||
&& equalq(caddr(p), -1, 2))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// p == -1/sqrt(2) ?
|
||||
|
||||
int
|
||||
isminussqrttwo(U *p)
|
||||
{
|
||||
if (car(p) == symbol(MULTIPLY)
|
||||
&& equaln(cadr(p), -1)
|
||||
&& issqrttwo(caddr(p))
|
||||
&& length(p) == 3)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -38,6 +38,7 @@ void append(void);
|
|||
// arccos.cpp
|
||||
void eval_arccos(void);
|
||||
void arccos(void);
|
||||
void yyarccos(void);
|
||||
void test_arccos(void);
|
||||
|
||||
// arccosh.cpp
|
||||
|
@ -48,6 +49,7 @@ void test_arccosh(void);
|
|||
// arcsin.cpp
|
||||
void eval_arcsin(void);
|
||||
void arcsin(void);
|
||||
void yyarcsin(void);
|
||||
void test_arcsin(void);
|
||||
|
||||
// arcsinh.cpp
|
||||
|
@ -516,6 +518,8 @@ int isoneover(U *p);
|
|||
int isfraction(U *p);
|
||||
int equaln(U *p, int n);
|
||||
int equalq(U *p, int a, int b);
|
||||
int issqrttwo(U *p);
|
||||
int isminussqrttwo(U *p);
|
||||
|
||||
// isprime.cpp
|
||||
void eval_isprime(void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue