5

我正在尝试找到类似Java Embedding Plugin (JEP) 的东西,它可以评估数学公式(字符串)并返回答案。

但它也应该计算一个变量,例如:(25+36+x)*2 = 25 应该给出:x = -11

有点像http://www.wolframalpha.com/,但它不应该是多才多艺的,它应该离线工作。

开源是首选。

我的小计算器项目需要它,http://sourceforge.net/projects/calex/

4

2 回答 2

3

这被称为Arithmetic evaluation。实现这一点的最简单方法之一是使用 Edsger Dijkstra Shunting-yard_algorithm

调车码算法是一种用于解析以中缀表示法指定的数学方程的方法。它可用于以反向波兰表示法 (RPN) 或作为抽象语法树 (AST) 生成输出。该算法由 Edsger Dijkstra 发明并命名为“调车场”算法,因为它的操作类似于铁路调车场。与 RPN 的评估一样,调车场算法是基于堆栈的。中缀表达式是大多数人习惯的数学符号形式,例如 3+4 或 3+4*(2−1)。对于转换,有两个文本变量(字符串),输入和输出。还有一个堆栈保存尚未添加到输出队列的运算符。为了进行转换,程序按顺序读取每个符号并根据该符号执行某些操作。

但是我已经在一些 stackoverflow 用户博客上看到了您正在寻找的确切解决方案,但我不记得地址(就像“代码猴子主义”)。它是轻量级的,你可以在小程序中使用(你也可以定义常量和重置值)。

编辑:找到它:http ://tech.dolhub.com/Code/MathEval

线性递归数学评估器

这个数学表达式求值器的诞生是因为需要一个占用空间小且高效的解决方案,该解决方案可以合理有效地评估任意表达式,而无需预编译。我需要一些可以对变量进行基本数学运算的东西,例如:“Top+2”、“Bottom-2”和“(Right+1-Left)/2”。

互联网上的研究出现了许多相当不错的解决方案,所有这些解决方案都围绕着创建解析树(这是有道理的)。问题是——它们都相当笨重,我不能仅仅为了数学而在我的小程序大小上增加 100K。所以我开始想知道这个问题的线性递归解决方案。最终结果是一个没有外部依赖的可以接受的单个类,重量不到 10 KiB。

于 2010-11-13T17:44:57.443 回答
0

根据Apache License 2.0的条款,我发布了一个基于Dijkstra 的 Shutting Yard算法的表达式评估器:

http://projects.congrace.de/exp4j/index.html

于 2011-07-23T17:38:29.490 回答