*** empty log message ***

This commit is contained in:
George Weigt 2007-05-08 19:45:06 -07:00
parent 01a58a918c
commit 1717dea264
6 changed files with 279 additions and 31 deletions

121
cos.cpp
View file

@ -15,10 +15,54 @@ void
cosine(void)
{
save();
yycosine();
yycosine_phase();
restore();
}
void
yycosine_phase(void)
{
int n = 0;
p1 = pop();
if (car(p1) != symbol(ADD)) {
push(p1);
yycosine();
return;
}
p2 = cdr(p1);
while (iscons(p2)) {
n = isnpi(car(p2));
if (n)
break;
p2 = cdr(p2);
}
if (n == 0) {
push(p1);
yycosine();
return;
}
push(p1);
push(car(p2));
subtract(); // remove phase
switch (n) {
case 1:
yysine();
negate();
break;
case 2:
yycosine();
negate();
break;
case 3:
yysine();
break;
case 4:
yycosine();
break;
}
}
void
yycosine(void)
{
@ -40,6 +84,14 @@ yycosine(void)
return;
}
// cosine function is symmetric, cos(-x) = cos(x)
if (isnegative(p1)) {
push(p1);
negate();
p1 = pop();
}
// cos(arctan(x)) = 1 / sqrt(1 + x^2)
// see p. 173 of the CRC Handbook of Mathematical Sciences
@ -55,14 +107,6 @@ yycosine(void)
return;
}
// cosine function is symmetric, cos(-x) = cos(x)
if (isnegative(p1)) {
push(p1);
negate();
p1 = pop();
}
// multiply by 180/pi
push(p1);
@ -266,6 +310,65 @@ static char *s[] = {
"cos(1/12*pi)",
"cos(1/12*pi)",
"cos(arctan(4/3))",
"3/5",
"cos(-arctan(4/3))",
"3/5",
// phase
"cos(x-8/2*pi)",
"cos(x)",
"cos(x-7/2*pi)",
"-sin(x)",
"cos(x-6/2*pi)",
"-cos(x)",
"cos(x-5/2*pi)",
"sin(x)",
"cos(x-4/2*pi)",
"cos(x)",
"cos(x-3/2*pi)",
"-sin(x)",
"cos(x-2/2*pi)",
"-cos(x)",
"cos(x-1/2*pi)",
"sin(x)",
"cos(x+0/2*pi)",
"cos(x)",
"cos(x+1/2*pi)",
"-sin(x)",
"cos(x+2/2*pi)",
"-cos(x)",
"cos(x+3/2*pi)",
"sin(x)",
"cos(x+4/2*pi)",
"cos(x)",
"cos(x+5/2*pi)",
"-sin(x)",
"cos(x+6/2*pi)",
"-cos(x)",
"cos(x+7/2*pi)",
"sin(x)",
"cos(x+8/2*pi)",
"cos(x)",
};
void

2
defs.h
View file

@ -1,4 +1,4 @@
#define SELFTEST 0
#define SELFTEST 1
// Symbolic expressions are built by connecting U structs.
//

34
is.cpp
View file

@ -436,3 +436,37 @@ isquarterturn(U *p)
return n;
}
// special multiple of pi?
// returns for the following multiples of pi...
// -4/2 -3/2 -2/2 -1/2 1/2 2/2 3/2 4/2
// 4 1 2 3 1 2 3 4
int
isnpi(U *p)
{
int n;
if (p == symbol(PI))
return 2;
if (car(p) == symbol(MULTIPLY)
&& isnum(cadr(p))
&& caddr(p) == symbol(PI)
&& length(p) == 3)
;
else
return 0;
push(cadr(p));
push_integer(2);
multiply();
n = pop_integer();
if (n == (int) 0x80000000)
return 0;
if (n < 0)
n = 4 - (-n) % 4;
else
n = 1 + (n - 1) % 4;
return n;
}

View file

@ -26,19 +26,26 @@ static char *s[] = {
"polar(1+i)",
"2^(1/2)*exp(1/4*i*pi)",
"rect(polar(3+4*i))", // needs sin(arctan(x)) and cos(arctan(x))
"polar(-1+i)",
"2^(1/2)*exp(3/4*i*pi)",
"polar(-1-i)",
"2^(1/2)*exp(-3/4*i*pi)",
"polar(1-i)",
"2^(1/2)*exp(-1/4*i*pi)",
"rect(polar(3+4*i))",
"3+4*i",
// someday, get these to simplify correctly
"rect(polar(-3+4*i))",
"-3+4*i",
// "rect(polar(-3+4*i))",
// "-3+4*i",
"rect(polar(3-4*i))",
"3-4*i",
// "rect(polar(3-4*i))",
// "3-4*i",
// "rect(polar(-3-4*i))",
// "-3-4*i",
"rect(polar(-3-4*i))",
"-3-4*i",
};
void

View file

@ -207,6 +207,7 @@ void test_convolution(void);
// cos.cpp
void eval_cos(void);
void cosine(void);
void yycosine_phase(void);
void yycosine(void);
void test_cos(void);
@ -526,6 +527,7 @@ int isminusoneoversqrttwo(U *p);
int isfloating(U *p);
int isimaginaryunit(U *p);
int isquarterturn(U *p);
int isnpi(U *p);
// isprime.cpp
void eval_isprime(void);
@ -828,6 +830,7 @@ void test_simplify(void);
// sin.cpp
void eval_sin(void);
void sine(void);
void yysine_phase(void);
void yysine(void);
void test_sin(void);

125
sin.cpp
View file

@ -15,16 +15,58 @@ void
sine(void)
{
save();
yysine();
yysine_phase();
restore();
}
void
yysine_phase(void)
{
int n = 0;
p1 = pop();
if (car(p1) != symbol(ADD)) {
push(p1);
yysine();
return;
}
p2 = cdr(p1);
while (iscons(p2)) {
n = isnpi(car(p2));
if (n)
break;
p2 = cdr(p2);
}
if (n == 0) {
push(p1);
yysine();
return;
}
push(p1);
push(car(p2));
subtract(); // remove phase
switch (n) {
case 1:
yycosine();
break;
case 2:
yysine();
negate();
break;
case 3:
yycosine();
negate();
break;
case 4:
yysine();
break;
}
}
void
yysine(void)
{
int n;
double d;
p1 = pop();
if (car(p1) == symbol(ARCSIN)) {
@ -40,6 +82,16 @@ yysine(void)
return;
}
// sine function is antisymmetric, sin(-x) = -sin(x)
if (isnegative(p1)) {
push(p1);
negate();
sine();
negate();
return;
}
// sin(arctan(x)) = x / sqrt(1 + x^2)
// see p. 173 of the CRC Handbook of Mathematical Sciences
@ -57,16 +109,6 @@ yysine(void)
return;
}
// sine function is antisymmetric, sin(-x) = -sin(x)
if (isnegative(p1)) {
push(p1);
negate();
sine();
negate();
return;
}
// multiply by 180/pi
push(p1);
@ -270,6 +312,65 @@ static char *s[] = {
"sin(1/12*pi)",
"sin(1/12*pi)",
"sin(arctan(4/3))",
"4/5",
"sin(-arctan(4/3))",
"-4/5",
// phase
"sin(x-8/2*pi)",
"sin(x)",
"sin(x-7/2*pi)",
"cos(x)",
"sin(x-6/2*pi)",
"-sin(x)",
"sin(x-5/2*pi)",
"-cos(x)",
"sin(x-4/2*pi)",
"sin(x)",
"sin(x-3/2*pi)",
"cos(x)",
"sin(x-2/2*pi)",
"-sin(x)",
"sin(x-1/2*pi)",
"-cos(x)",
"sin(x+0/2*pi)",
"sin(x)",
"sin(x+1/2*pi)",
"cos(x)",
"sin(x+2/2*pi)",
"-sin(x)",
"sin(x+3/2*pi)",
"-cos(x)",
"sin(x+4/2*pi)",
"sin(x)",
"sin(x+5/2*pi)",
"cos(x)",
"sin(x+6/2*pi)",
"-sin(x)",
"sin(x+7/2*pi)",
"-cos(x)",
"sin(x+8/2*pi)",
"sin(x)",
};
void