Java中的数学计算

math calculating in java

本文关键字:计算 Java      更新时间:2023-10-16

我正在尝试用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。