⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbol.java

📁 利用开源的源码为一个朋友的V3手机手机写的科学计算器
💻 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 + -