*** empty log message ***

This commit is contained in:
George Weigt 2007-04-24 16:53:40 -07:00
parent 9ea20b81b1
commit ae0723c1bc
4 changed files with 109 additions and 16 deletions

View file

@ -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

View file

@ -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
View file

@ -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;
}

View file

@ -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);