📄 symbol.java
字号:
/* * Symbol.java * * Created on 2007-10-19, 10:30:42 * * To change this template, choose Tools | Templates * and open the template in the editor. */package xcalc;/** * * @author Xiaobo Lee */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 + -