📄 symbol.java
字号:
package xcalc;
interface Symbol
{
public abstract Real eval();
}
final class Num implements Symbol
{
private static Num xVar = new Num(Real.ZERO);
private static Num yVar = new Num(Real.ZERO);
private Real a;
public static Num getXVar(){
return xVar;
}
public static void setXVar(Real x){
if(x!=null) xVar.a = x;
}
public static Num getYVar(){
return yVar;
}
public static void setYVar(final Real y){
if(y!=null) yVar.a = y;
}
public Num(final Real a)
{
this.a = a;
}
public Real eval()
{
return new Real(a);
}
}
final class Exp1 implements Symbol
{
private final Symbol a;
private final int operator;
private static Real DegGradToRad(Real val) {
if (Options.RadDegGrad == 1){
val.mul(Real.PI);
val.div(180);
}
else if (Options.RadDegGrad == 2){
val.mul(Real.PI);
val.div(200);
}
return val;
}
private static Real RadToDegGrad(Real val){
if (Options.RadDegGrad == 1){
val.mul(180);
val.div(Real.PI);
}else if (Options.RadDegGrad == 2){
val.mul(200);
val.div(Real.PI);
}
return val;
}
public Exp1(final int operator, final Symbol a){
this.a = a;
this.operator = operator;
}
public Real eval() {
final Real b = a.eval();
switch(operator){
case Solver.K_SUB: b.neg(); break;
case Solver.K_SQRT: b.sqrt();break;
case Solver.K_LOG10: b.log10(); break;
case Solver.K_LOG2: b.log2(); break;
case Solver.K_LN : b.ln(); break;
case Solver.K_SIN: DegGradToRad(b).sin(); break;
case Solver.K_COS: DegGradToRad(b).cos(); break;
case Solver.K_TAN: DegGradToRad(b).tan(); break;
case Solver.K_ASIN: b.asin();RadToDegGrad(b); break;
case Solver.K_ACOS: b.acos();RadToDegGrad(b); break;
case Solver.K_ATAN: b.atan();RadToDegGrad(b); break;
case Solver.K_SINH: b.sinh(); break;
case Solver.K_COSH: b.cosh(); break;
case Solver.K_TANH: b.tanh(); break;
case Solver.K_ASINH: b.asinh(); break;
case Solver.K_ACOSH: b.acosh(); break;
case Solver.K_ATANH: b.atanh(); break;
case Solver.K_FAC: b.fact();break;
case Solver.K_ABS: b.abs(); break;
}
return b;
}
}
final class Exp2 implements Symbol
{
private final Symbol a,b;
private final int operator;
public Exp2(final int operator,final Symbol a,final Symbol b){
this.operator = operator;
this.a = a;
this.b = b;
}
public Real eval() {
final Real left = a.eval();
final Real right = b.eval();
switch(this.operator){
case Solver.K_ADD: left.add(right); break;
case Solver.K_SUB: left.sub(right); break;
case Solver.K_MUL: left.mul(right); break;
case Solver.K_DIV: left.div(right); break;
case Solver.K_POWER: left.pow(right); break;
case Solver.K_PER:
if (left.isNegative() && right.isIntegral()) {
// Special case
// Py,x = (-1)^x * fact(-y-1+x)/fact(-y-1)
boolean negative = right.isOdd();
left.neg();
left.sub(Real.ONE);
right.add(left);
right.fact();
left.fact();
left.rdiv(right);
if (negative)
left.neg();
} else {
// P(a,b) = fact(a)/fact(b-a)
System.out.println(left.toString());
System.out.println(right.toString());
right.neg();
right.add(left);
right.fact();
left.fact();
left.div(right);
System.out.println(left.toString());
}
break;
case Solver.K_COM:
final Real rTmp = new Real();
if (left.isNegative() && right.isIntegral()) {
// Special case
// Cleft,right = (-1)^right * fact(-left-1+right)/(fact(-left-1) * fact(right))
boolean negative = right.isOdd();
rTmp.assign(right);
rTmp.fact();
left.neg();
left.sub(Real.ONE);
right.add(left);
right.fact();
left.fact();
left.mul(rTmp);
left.rdiv(right);
if (negative)
left.neg();
} else {
// Cleft,right = fact(left)/(fact(left-right)*fact(right))
rTmp.assign(right);
rTmp.fact();
right.neg();
right.add(left);
right.fact();
right.mul(rTmp);
left.fact();
left.div(right);
}
break;
}
return left;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -