📄 parser.c
字号:
mStkFunct(dStkRound); /* call lStk via dStk */
}
void lStkRound(void) {
/* Add .5 then truncate */
Arg1->l.x += (1L<<bitshiftless1);
Arg1->l.y += (1L<<bitshiftless1);
lStkFloor();
}
#endif
void (*StkRound)(void) = dStkRound;
void dStkZero(void) {
Arg1->d.y = Arg1->d.x = 0.0;
}
#ifndef XFRACT
void mStkZero(void) {
Arg1->m.x.Mant = Arg1->m.x.Exp = 0;
Arg1->m.y.Mant = Arg1->m.y.Exp = 0;
}
void lStkZero(void) {
Arg1->l.y = Arg1->l.x = 0;
}
#endif
void (*StkZero)(void) = dStkZero;
void dStkReal(void) {
Arg1->d.y = 0.0;
}
#ifndef XFRACT
void mStkReal(void) {
Arg1->m.y.Mant = (long)(Arg1->m.y.Exp = 0);
}
void lStkReal(void) {
Arg1->l.y = 0l;
}
#endif
void (*StkReal)(void) = dStkReal;
void dStkImag(void) {
Arg1->d.x = Arg1->d.y;
Arg1->d.y = 0.0;
}
#ifndef XFRACT
void mStkImag(void) {
Arg1->m.x = Arg1->m.y;
Arg1->m.y.Mant = (long)(Arg1->m.y.Exp = 0);
}
void lStkImag(void) {
Arg1->l.x = Arg1->l.y;
Arg1->l.y = 0l;
}
#endif
void (*StkImag)(void) = dStkImag;
void dStkNeg(void) {
Arg1->d.x = -Arg1->d.x;
Arg1->d.y = -Arg1->d.y;
}
#ifndef XFRACT
void mStkNeg(void) {
Arg1->m.x.Exp ^= 0x8000;
Arg1->m.y.Exp ^= 0x8000;
}
void lStkNeg(void) {
Arg1->l.x = -Arg1->l.x;
Arg1->l.y = -Arg1->l.y;
}
#endif
void (*StkNeg)(void) = dStkNeg;
void dStkMul(void) {
FPUcplxmul(&Arg2->d, &Arg1->d, &Arg2->d);
Arg1--;
Arg2--;
}
#ifndef XFRACT
void mStkMul(void) {
Arg2->m = MPCmul(Arg2->m, Arg1->m);
Arg1--;
Arg2--;
}
void lStkMul(void) {
long x, y;
x = multiply(Arg2->l.x, Arg1->l.x, bitshift) -
multiply(Arg2->l.y, Arg1->l.y, bitshift);
y = multiply(Arg2->l.y, Arg1->l.x, bitshift) +
multiply(Arg2->l.x, Arg1->l.y, bitshift);
Arg2->l.x = x;
Arg2->l.y = y;
Arg1--;
Arg2--;
}
#endif
void (*StkMul)(void) = dStkMul;
void dStkDiv(void) {
FPUcplxdiv(&Arg2->d, &Arg1->d, &Arg2->d);
Arg1--;
Arg2--;
}
#ifndef XFRACT
void mStkDiv(void) {
Arg2->m = MPCdiv(Arg2->m, Arg1->m);
Arg1--;
Arg2--;
}
void lStkDiv(void) {
long x, y, mod, x2, y2;
mod = multiply(Arg1->l.x, Arg1->l.x, bitshift) +
multiply(Arg1->l.y, Arg1->l.y, bitshift);
x = divide(Arg1->l.x, mod, bitshift);
y = -divide(Arg1->l.y, mod, bitshift);
/* pb 900617 changed next 4 lines to use x2,y2 instead of x,y */
x2 = multiply(Arg2->l.x, x, bitshift) - multiply(Arg2->l.y, y, bitshift);
y2 = multiply(Arg2->l.y, x, bitshift) + multiply(Arg2->l.x, y, bitshift);
Arg2->l.x = x2;
Arg2->l.y = y2;
Arg1--;
Arg2--;
}
#endif
void (*StkDiv)(void) = dStkDiv;
void dStkMod(void) {
Arg1->d.x = (Arg1->d.x * Arg1->d.x) + (Arg1->d.y * Arg1->d.y);
Arg1->d.y = 0.0;
}
#ifndef XFRACT
void mStkMod(void) {
Arg1->m.x = MPCmod(Arg1->m);
Arg1->m.y.Mant = (long)(Arg1->m.y.Exp = 0);
}
void lStkMod(void) {
/* Arg1->l.x = multiply(Arg2->l.x, Arg1->l.x, bitshift) + */
/* multiply(Arg2->l.y, Arg1->l.y, bitshift); */
/*** I don't understand how this ever worked correctly! JCO 12/31/94 ***/
Arg1->l.x = multiply(Arg1->l.x, Arg1->l.x, bitshift) +
multiply(Arg1->l.y, Arg1->l.y, bitshift);
if(Arg1->l.x < 0)
overflow = 1;
Arg1->l.y = 0L;
}
void lStkModOld(void) {
Arg1->l.x = multiply(Arg2->l.x, Arg1->l.x, bitshift) +
multiply(Arg2->l.y, Arg1->l.y, bitshift);
if(Arg1->l.x < 0)
overflow = 1;
Arg1->l.y = 0L;
}
#endif
void (*StkMod)(void) = dStkMod;
void StkSto(void) {
*Store[StoPtr++] = *Arg1;
}
void StkLod(void) {
Arg1++;
Arg2++;
*Arg1 = *Load[LodPtr++];
}
void StkClr(void) {
s[0] = *Arg1;
Arg1 = &s[0];
Arg2 = Arg1;
Arg2--;
}
/* MCP 4-9-91, Added Flip() */
void dStkFlip(void) {
double t;
t = Arg1->d.x;
Arg1->d.x = Arg1->d.y;
Arg1->d.y = t;
}
#ifndef XFRACT
void mStkFlip(void) {
struct MP t;
t = Arg1->m.x;
Arg1->m.x = Arg1->m.y;
Arg1->m.y = t;
}
void lStkFlip(void) {
long t;
t = Arg1->l.x;
Arg1->l.x = Arg1->l.y;
Arg1->l.y = t;
}
#endif
void (*StkFlip)(void) = dStkFlip;
void dStkSin(void) {
double sinx, cosx, sinhy, coshy;
FPUsincos(&Arg1->d.x, &sinx, &cosx);
FPUsinhcosh(&Arg1->d.y, &sinhy, &coshy);
Arg1->d.x = sinx*coshy;
Arg1->d.y = cosx*sinhy;
}
#ifndef XFRACT
void mStkSin(void) {
mStkFunct(dStkSin); /* call lStk via dStk */
}
void lStkSin(void) {
long x, y, sinx, cosx, sinhy, coshy;
x = Arg1->l.x >> Delta16;
y = Arg1->l.y >> Delta16;
SinCos086(x, &sinx, &cosx);
SinhCosh086(y, &sinhy, &coshy);
Arg1->l.x = multiply(sinx, coshy, ShiftBack); /* TIW 06-18-90 */
Arg1->l.y = multiply(cosx, sinhy, ShiftBack); /* TIW 06-18-90 */
}
#endif
void (*StkSin)(void) = dStkSin;
/* The following functions are supported by both the parser and for fn
variable replacement. TIW 04-22-91 */
void dStkTan(void) {
double sinx, cosx, sinhy, coshy, denom;
Arg1->d.x *= 2;
Arg1->d.y *= 2;
FPUsincos(&Arg1->d.x, &sinx, &cosx);
FPUsinhcosh(&Arg1->d.y, &sinhy, &coshy);
denom = cosx + coshy;
ChkFloatDenom(denom);
Arg1->d.x = sinx/denom;
Arg1->d.y = sinhy/denom;
}
#ifndef XFRACT
void mStkTan(void) {
mStkFunct(dStkTan); /* call lStk via dStk */
}
void lStkTan(void) {
long x, y, sinx, cosx, sinhy, coshy, denom;
x = Arg1->l.x >> Delta16;
x = x << 1;
y = Arg1->l.y >> Delta16;
y = y << 1;
SinCos086(x, &sinx, &cosx);
SinhCosh086(y, &sinhy, &coshy);
denom = cosx + coshy;
ChkLongDenom(denom);
Arg1->l.x = divide(sinx,denom,bitshift);
Arg1->l.y = divide(sinhy,denom,bitshift);
}
#endif
void (*StkTan)(void) = dStkTan;
void dStkTanh(void) {
double siny, cosy, sinhx, coshx, denom;
Arg1->d.x *= 2;
Arg1->d.y *= 2;
FPUsincos(&Arg1->d.y, &siny, &cosy);
FPUsinhcosh(&Arg1->d.x, &sinhx, &coshx);
denom = coshx + cosy;
ChkFloatDenom(denom);
Arg1->d.x = sinhx/denom;
Arg1->d.y = siny/denom;
}
#ifndef XFRACT
void mStkTanh(void) {
mStkFunct(dStkTanh); /* call lStk via dStk */
}
void lStkTanh(void) {
long x, y, siny, cosy, sinhx, coshx, denom;
x = Arg1->l.x >> Delta16;
x = x << 1;
y = Arg1->l.y >> Delta16;
y = y << 1;
SinCos086(y, &siny, &cosy);
SinhCosh086(x, &sinhx, &coshx);
denom = coshx + cosy;
ChkLongDenom(denom);
Arg1->l.x = divide(sinhx,denom,bitshift);
Arg1->l.y = divide(siny,denom,bitshift);
}
#endif
void (*StkTanh)(void) = dStkTanh;
void dStkCoTan(void) {
double sinx, cosx, sinhy, coshy, denom;
Arg1->d.x *= 2;
Arg1->d.y *= 2;
FPUsincos(&Arg1->d.x, &sinx, &cosx);
FPUsinhcosh(&Arg1->d.y, &sinhy, &coshy);
denom = coshy - cosx;
ChkFloatDenom(denom);
Arg1->d.x = sinx/denom;
Arg1->d.y = -sinhy/denom;
}
#ifndef XFRACT
void mStkCoTan(void) {
mStkFunct(dStkCoTan); /* call lStk via dStk */
}
void lStkCoTan(void) {
long x, y, sinx, cosx, sinhy, coshy, denom;
x = Arg1->l.x >> Delta16;
x = x << 1;
y = Arg1->l.y >> Delta16;
y = y << 1;
SinCos086(x, &sinx, &cosx);
SinhCosh086(y, &sinhy, &coshy);
denom = coshy - cosx;
ChkLongDenom(denom);
Arg1->l.x = divide(sinx,denom,bitshift);
Arg1->l.y = -divide(sinhy,denom,bitshift);
}
#endif
void (*StkCoTan)(void) = dStkCoTan;
void dStkCoTanh(void) {
double siny, cosy, sinhx, coshx, denom;
Arg1->d.x *= 2;
Arg1->d.y *= 2;
FPUsincos(&Arg1->d.y, &siny, &cosy);
FPUsinhcosh(&Arg1->d.x, &sinhx, &coshx);
denom = coshx - cosy;
ChkFloatDenom(denom);
Arg1->d.x = sinhx/denom;
Arg1->d.y = -siny/denom;
}
#ifndef XFRACT
void mStkCoTanh(void) {
mStkFunct(dStkCoTanh); /* call lStk via dStk */
}
void lStkCoTanh(void) {
long x, y, siny, cosy, sinhx, coshx, denom;
x = Arg1->l.x >> Delta16;
x = x << 1;
y = Arg1->l.y >> Delta16;
y = y << 1;
SinCos086(y, &siny, &cosy);
SinhCosh086(x, &sinhx, &coshx);
denom = coshx - cosy;
ChkLongDenom(denom);
Arg1->l.x = divide(sinhx,denom,bitshift);
Arg1->l.y = -divide(siny,denom,bitshift);
}
#endif
void (*StkCoTanh)(void) = dStkCoTanh;
/* The following functions are not directly used by the parser - support
for the parser was not provided because the existing parser language
represents these quite easily. They are used for fn variable support
in miscres.c but are placed here because they follow the pattern of
the other parser functions. TIW 04-22-91 */
void dStkRecip(void) {
double mod;
mod =Arg1->d.x * Arg1->d.x + Arg1->d.y * Arg1->d.y;
ChkFloatDenom(mod);
Arg1->d.x = Arg1->d.x/mod;
Arg1->d.y = -Arg1->d.y/mod;
}
#ifndef XFRACT
void mStkRecip(void) {
struct MP mod;
mod = *MPadd(*MPmul(Arg1->m.x, Arg1->m.x),*MPmul(Arg1->m.y, Arg1->m.y));
if(mod.Mant == 0L) {
overflow = 1;
return;
}
Arg1->m.x = *MPdiv(Arg1->m.x,mod);
Arg1->m.y = *MPdiv(Arg1->m.y,mod);
Arg1->m.y.Exp ^= 0x8000;
}
void lStkRecip(void) {
long mod;
mod = multiply(Arg1->l.x,Arg1->l.x,bitshift)
+ multiply(Arg1->l.y,Arg1->l.y,bitshift);
if(save_release > 1920) {
ChkLongDenom(mod);
} else if(mod<=0L) return;
Arg1->l.x = divide(Arg1->l.x,mod,bitshift);
Arg1->l.y = -divide(Arg1->l.y,mod,bitshift);
}
#endif
void StkIdent(void) { /* do nothing - the function Z */
}
/* End TIW 04-22-91 */
void dStkSinh(void) {
double siny, cosy, sinhx, coshx;
FPUsincos(&Arg1->d.y, &siny, &cosy);
FPUsinhcosh(&Arg1->d.x, &sinhx, &coshx);
Arg1->d.x = sinhx*cosy;
Arg1->d.y = coshx*siny;
}
#ifndef XFRACT
void mStkSinh(void) {
mStkFunct(dStkSinh); /* call lStk via dStk */
}
void lStkSinh(void) {
long x, y, sinhx, coshx, siny, cosy;
x = Arg1->l.x >> Delta16;
y = Arg1->l.y >> Delta16;
SinCos086(y, &siny, &cosy);
SinhCosh086(x, &sinhx, &coshx);
Arg1->l.x = multiply(cosy, sinhx, ShiftBack); /* TIW 06-18-90 */
Arg1->l.y = multiply(siny, coshx, ShiftBack); /* TIW 06-18-90 */
}
#endif
void (*StkSinh)(void) = dStkSinh;
void dStkCos(void) {
double sinx, cosx, sinhy, coshy;
FPUsincos(&Arg1->d.x, &sinx, &cosx);
FPUsinhcosh(&Arg1->d.y, &sinhy, &coshy);
Arg1->d.x = cosx*coshy;
Arg1->d.y = -sinx*sinhy; /* TIW 04-25-91 sign */
}
#ifndef XFRACT
void mStkCos(void) {
mStkFunct(dStkCos); /* call lStk via dStk */
}
void lStkCos(void) {
long x, y, sinx, cosx, sinhy, coshy;
x = Arg1->l.x >> Delta16;
y = Arg1->l.y >> Delta16;
SinCos086(x, &sinx, &cosx);
SinhCosh086(y, &sinhy, &coshy);
Arg1->l.x = multiply(cosx, coshy, ShiftBack); /* TIW 06-18-90 */
Arg1->l.y = -multiply(sinx, sinhy, ShiftBack); /* TIW 04-25-91 sign */
}
#endif
void (*StkCos)(void) = dStkCos;
/* Bogus version of cos, to replicate bug which was in regular cos till v16: */
void dStkCosXX(void) {
dStkCos();
Arg1->d.y = -Arg1->d.y;
}
#ifndef XFRACT
void mStkCosXX(void) {
mStkFunct(dStkCosXX); /* call lStk via dStk */
}
void lStkCosXX(void) {
lStkCos();
Arg1->l.y = -Arg1->l.y;
}
#endif
void (*StkCosXX)(void) = dStkCosXX;
void dStkCosh(void) {
double siny, cosy, sinhx, coshx;
FPUsincos(&Arg1->d.y, &siny, &cosy);
FPUsinhcosh(&Arg1->d.x, &sinhx, &coshx);
Arg1->d.x = coshx*cosy;
Arg1->d.y = sinhx*siny;
}
#ifndef XFRACT
void mStkCosh(void) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -