Математическое выражение (строка) для числа в Java
Я пытаюсь найти что-то вроде Java Embedded Plugin (JEP), который может оценить математическую формулу (строку) и дать ответ.
Но он также должен вычислять переменную, например: (25+36+x)*2 = 25 должно дать: x = -11
Немного похоже на http://www.wolframalpha.com/, но оно не должно быть таким универсальным и работать автономно.
Открытый источник является предпочтительным.
Мне это нужно для моего маленького проекта калькулятора, http://sourceforge.net/projects/calex/.
2 ответа
Это называется Arithmetic evaluation
, Один из самых простых способов реализовать это - использовать Edsger Dijkstra http://en.wikipedia.org/wiki/Shunting-yard_algorithm.
Алгоритм маневрового двора - это метод анализа математических уравнений, указанных в инфиксной записи. Его можно использовать для вывода в обратной польской нотации (RPN) или в виде абстрактного синтаксического дерева (AST). Алгоритм был изобретен Эдсгером Дейкстрой и назван алгоритмом "маневрового двора", потому что его работа напоминает работу маневрового участка железной дороги. Как и при оценке RPN, алгоритм шунтирующего двора основан на стеке. Инфиксные выражения - это форма математической нотации, к которой привыкло большинство людей, например 3+4 или 3+4*(2−1). Для преобразования есть две текстовые переменные (строки), вход и выход. Существует также стек, в котором хранятся операторы, еще не добавленные в очередь вывода. Для преобразования программа считывает каждый символ по порядку и делает что-то на основе этого символа.
Но я видел точное решение того, что вы ищете в каком-то блоге пользователя stackru, но я не могу вспомнить адрес (это было похоже на "код обезьянства"). Это был легкий класс, который вы могли использовать в апплетах (вы также могли определять константы и значения сброса).
Изменить: Найдено: http://tech.dolhub.com/Code/MathEval
Линейно-рекурсивный математический оценщик
Этот оценщик математических выражений был рожден из-за необходимости иметь компактное и эффективное решение, которое могло бы достаточно эффективно оценивать произвольные выражения, не требуя предварительной компиляции. Мне нужно было что-то, что делало бы основную математику с переменными, такими выражениями, как "Top+2", "Bottom-2" и "(Right+1-Left)/2".
Исследования в Интернете выявили ряд довольно хороших решений, все из которых вращались вокруг создания деревьев разбора (что имеет смысл). Проблема была в том, что все они были довольно громоздкими, и я не мог позволить себе добавить 100К к размеру моего апплета только для математики. Поэтому я начал задумываться о линейном рекурсивном решении проблемы. Конечным результатом является приемлемо работающий отдельный класс без внешних зависимостей весом менее 10 КиБ.
Я выпустил средство оценки выражений, основанное на алгоритме Shijnting Yard Дейкстры, в соответствии с условиями лицензии Apache License 2.0: