//********************************************************************
// evalMyJava :(Javaでの自作の eval() 関数)
// All rights reserved. Copyright (C) 2006-,YokahiYokatoki
//********************************************************************

// 自作の eval関数----------▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
public String evalMyJava(double x,String equation)
{
	String equ="("+equation+")"; // ( )でくくる
	equ=equ.replace("-","$"); // 演算記号 "-" を "$" に置換(負符号の "-" と区別するため)
	equ=equ.replace("Math.PI",Double.toString(Math.PI)); // "π" を数値に置換
	equ=equ.replace("Math.E",Double.toString(Math.E)); // "e" を数値に置換
	equ=equ.replace("exp","ezp"); // "exp" を "ezp" に置換
	equ=equ.replace("x",Double.toString(x)); // "x" を数字に置換
	equ=equ.replace("ezp","exp"); // "ezp" を "exp" に戻す
	while(true)
	{
		int n1=equ.indexOf(")"); if(n1<0){return equ;} // 完了---●●●
		int n2=equ.lastIndexOf("(",n1-1); // "(" に対応する ")" の検索
		if(n2<0){return "NaN";} // ")" に対応する "(" がないので不適
		String str=equ.substring(n2+1,n1); // ( )内の文字
		int ne0=str.indexOf(","); // ( )内の "," の検索
		double val=0;
		if(ne0>=0) // ( )内に "," がある場合、"Math.log(strA,strB)" or "Math.pow(strA,strB)"
		{
			String strA=str.substring(0,ne0); //---●●
			double valA=0;
			try // strA が数値(2.34 or -0.12 etc.)かチェック(ここでは "$3.4" などは数値としない)
			{
				valA=Double.parseDouble(strA);
			}
			catch(NumberFormatException ex) // strA が数式なら計算し数値を求める
			{
				try{valA=Double.parseDouble(evalMy1(strA));} catch(NumberFormatException ex1){return "NaN";}
			}
			String texA=Double.toString(valA);
			if(texA.equals("NaN") || texA.equals("Infinity") || texA.equals("-Infinity")){return "NaN";}
			String strB=str.substring(ne0+1); //---●●
			double valB=0;
			try // strB が数値(2.34 or -0.12 etc.)かチェック(ここでは "$3.4" などは数値としない)
			{
				valB=Double.parseDouble(strB);
			}
			catch(NumberFormatException ex) // strB が数式なら計算し数値を求める
			{
				try{valB=Double.parseDouble(evalMy1(strB));} catch(NumberFormatException ex1){return "NaN";}
			}
			String texB=Double.toString(valB);
			if(texB.equals("NaN") || texB.equals("Infinity") || texB.equals("-Infinity")){return "NaN";}
			if((equ.substring(n2-3,n2)).equals("log")) // "Math.log(strA,strB)" のとき
			{
				if(valA<=0 || valA==1){return "NaN";} // (底は1以外の正でなくてはならない)
				if(valB<0){return "NaN";} // (真数は正でなくてはならない)
				val=Math.log(valB)/Math.log(valA);
				String texV=Double.toString(val);
				if(texV.equals("NaN") || texV.equals("Infinity") || texV.equals("-Infinity")){return "NaN";}
				equ=equ.replace("Math.log("+strA+","+strB+")",texV);
			}
			else if((equ.substring(n2-3,n2)).equals("pow")) // "Math.pow(strA,strB)" のとき
			{
				val=Math.pow(valA,valB);
				String texV=Double.toString(val);
				if(texV.equals("NaN") || texV.equals("Infinity") || texV.equals("-Infinity")){return "NaN";}
				equ=equ.replace("Math.pow("+strA+","+strB+")",texV);
			}
		}
		else // ( )内の str に "," がない場合
		{
			try // str が数値(2.34 or -0.12 etc.)かチェック
			{
				val=Double.parseDouble(str);
			}
			catch(NumberFormatException ex) // str が数式なら計算し数値を求める
			{
				try{val=Double.parseDouble(evalMy1(str));} catch(NumberFormatException ex1){return "NaN";}
			}
			String texV=Double.toString(val);
			if(texV.equals("NaN") || texV.equals("Infinity") || texV.equals("-Infinity")){return "NaN";}
			if(n2-8>=0)
			{
				String str1=equ.substring(n2-8,n2);
				if(str1.equals("Math.sin")){val=Math.sin(val); equ=equ.replace("Math.sin("+str+")",Double.toString(val)); n2-=8;}
				else if(str1.equals("Math.cos")){val=Math.cos(val); equ=equ.replace("Math.cos("+str+")",Double.toString(val)); n2-=8;}
				else if(str1.equals("Math.tan")){val=Math.tan(val); equ=equ.replace("Math.tan("+str+")",Double.toString(val)); n2-=8;}
				else if(str1.equals("ath.asin")){val=Math.asin(val); equ=equ.replace("Math.asin("+str+")",Double.toString(val)); n2-=9;}
				else if(str1.equals("ath.acos")){val=Math.acos(val); equ=equ.replace("Math.acos("+str+")",Double.toString(val)); n2-=9;}
				else if(str1.equals("ath.atan")){val=Math.atan(val); equ=equ.replace("Math.atan("+str+")",Double.toString(val)); n2-=9;}
				else if(str1.equals("Math.log")){val=Math.log(val); equ=equ.replace("Math.log("+str+")",Double.toString(val)); n2-=8;}
				else if(str1.equals("Math.exp")){val=Math.exp(val); equ=equ.replace("Math.exp("+str+")",Double.toString(val)); n2-=8;}
				else if(str1.equals("Math.abs")){val=Math.abs(val); equ=equ.replace("Math.abs("+str+")",Double.toString(val)); n2-=8;}
				else if(str1.equals("ath.sqrt")){val=Math.sqrt(val); equ=equ.replace("Math.sqrt("+str+")",Double.toString(val)); n2-=9;}
				else {equ=equ.replace("("+str+")",Double.toString(val));} // ( ) を除去
			}
			else // ( ) だけのとき(注:evalMyJava(自作関数)で最初に全体を( )でくくった)
			{
				equ=equ.replace("("+str+")",Double.toString(val)); // ( ) を除去
			}
		}
	}
}

// "数字,+,$(演算-の意味),*,/" および "-"(負符号) のみからなる数式の処理----
public String evalMy1(String equation)
{
	int i=0,j=0,k=0;
	String[] str=equation.split("(?=[+$])"); // "+" or "$" で分割("(?= )"は、分割した文字を前に付けるため)
	k=str.length;
	for(i=k-1; i>=0; i--) // 空の str[] を除去
	{
		if(str[i].equals(""))
		{
			for(j=i; j