//******************************************************************** // 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