Через восемь лет после того, как был задан этот вопрос: если вы не хотите заново изобретать колесо, есть много экзотических математических парсеров.
Я написал один год назад, который поддерживает арифметические операции, решение уравнений, дифференциальное исчисление, интегральное исчисление, базовую статистику, определение функции / формулы, построение графиков и т. Д.
Его называют ParserNG и его открытый исходный код.
Оценить выражение так же просто, как:
MathExpression expr = new MathExpression("(34+32)-44/(8+9(3+2))-22");
System.out.println("result: " + expr.solve());
result: 43.16981132075472
Или использовать переменные и вычислить простые выражения:
MathExpression expr = new MathExpression("r=3;P=2*pi*r;");
System.out.println("result: " + expr.getValue("P"));
Или с помощью функций:
MathExpression expr = new MathExpression("f(x)=39*sin(x^2)+x^3*cos(x);f(3)");
System.out.println("result: " + expr.solve());
result: -10.65717648378352
Или для оценки производной в заданной точке (обратите внимание, что она выполняет символическое дифференцирование (не числовое) за кулисами, поэтому точность не ограничивается ошибками числовых приближений):
MathExpression expr = new MathExpression("f(x)=x^3*ln(x); diff(f,3,1)");
System.out.println("result: " + expr.solve());
result: 38.66253179403897
Что отличает x^3 * ln(x)
один раз при x = 3.Количество раз, которое вы можете различить, пока равно 1.
или для числовой интеграции:
MathExpression expr = new MathExpression("f(x)=2*x; intg(f,1,3)");
System.out.println("result: " + expr.solve());
result: 7.999999999998261... approx: 8
Этот синтаксический анализатор работает довольно быстро и обладает множеством других функций.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: ParserNG создан мной.