*** empty log message ***
This commit is contained in:
parent
01a58a918c
commit
1717dea264
6 changed files with 279 additions and 31 deletions
121
cos.cpp
121
cos.cpp
|
@ -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
2
defs.h
|
@ -1,4 +1,4 @@
|
|||
#define SELFTEST 0
|
||||
#define SELFTEST 1
|
||||
|
||||
// Symbolic expressions are built by connecting U structs.
|
||||
//
|
||||
|
|
34
is.cpp
34
is.cpp
|
@ -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;
|
||||
}
|
||||
|
|
25
polar.cpp
25
polar.cpp
|
@ -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
|
||||
|
|
|
@ -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
125
sin.cpp
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue