Java中的数学计算
math calculating in java
我正在尝试用Java开发一个高级数学表达式计算器。我的目标是计算器可以确定如下表达式:
2 * 6^( log(123) - sin(7)^cos(2) )
lim( (5x^2) / x , x -> 1)
.
.
.
在 Java 或 C++ 中有什么(默认函数、外部库)吗?
你可以这样做...
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class Test {
public static void main(String[] args) throws Exception{
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String foo = "2 * 6^( log(123) - sin(7)^cos(2) )";
System.out.println(engine.eval(foo));
}
}
此外,如果您想解决限制,您可以随时使用 API。您可以使用该 API 的正确语法发送请求,这将为您提供您可以解析的结果。然而,这更难编程,而且API通常不是免费的。另一种选择是自己计算限制,我不知道该或标准的 APIJava 函数。
如果你真的想从头开始并重新发明weel,我建议你构建自己的评估函数。这是一个很好的起点:Java/c++ 示例。
如果你的表达式不是很复杂,我认为这个答案会以正确的方式指导你:
用于计算 Java 中数学表达式的内置方法
如果你的表达相当复杂,使用像你的例子中的限制,我建议你看看龙书。实现一个简单的表达式解析器并使用下面的一些强大的数学库应该更容易。
这与其说是一个Java领域问题,不如说是一个语言解析问题。实现此目的的传统方法是构建一个词法分析和解析器,有时使用另一种语言,以您想要的语言生成代码。这样,您就可以将解析问题与实际的"客户端"程序关注点分开。
从长远来看,这可能比尝试编写一个非常复杂的正则表达式状态机更容易,后者很难证明在所有情况下都是正确的。中缀数学解析器/处理器非常有趣,拥有规则和定义的"小语言"版本可以更容易地证明您的程序是正确的。
在Java中,你可能要考虑ANTLR来生成解析器,尽管我承认我从来没有使用过它。但我的理解是,如果你使用过Lex&Yacc,ANTLR已经足够熟悉了。
[更新]
我不知道中缀是否是一个硬性要求,但是如果您不想生成解析器,使用堆栈和后缀操作解析复杂的数学可以更容易实现。作为额外的奖励,这使您可以像尤达一样进行数学运算。
一般来说,你需要的被称为计算机代数系统。我不知道你有什么要求,但至少有 2 种一般方法可以做到。
(1)将你的程序链接到一个库来做代数的东西。对于C++你可以尝试Yacas,对于Python,你可以尝试Sympy。Dunno about Java。
(2) 单独编写程序,并通过套接字与 CAS 通信。在这种情况下,CAS 可以是任何东西,例如 Maxima、Sage 等。套接字接口的工作量可能比您想象的要少 -- 它肯定比重新实现 CAS 函数要少得多。
在不知道您的需求的情况下,我的建议是用Python编写程序并使用Sympy。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 我可以在Apache Ignite计算中混合使用C++和Java吗?
- Java中的数学计算
- 什么等效于C/C++中的java静态最终成员变量,以及如何通过一些计算对其进行初始化
- 如何驱动 C#、C++ 或 Java 编译器计算 1+2+3+.编译时为 +1000
- 长数据类型计算-为什么Java比c++快得多
- 如何在C++或Java中计算方差、中值和标准差
- 如何用java或c语言计算3^1002的数字和
- 计算汉明权重,在Java中也称为popcount
- C/ c++ /Java问题:for循环中使用的表达式会计算多次吗?