java中的数学计算
我正在尝试用Java开发一个高级数学表达式计算器。我的目标是计算器可以确定如下表达式:java中的数学计算,java,c++,math,calculator,Java,C++,Math,Calculator,我正在尝试用Java开发一个高级数学表达式计算器。我的目标是计算器可以确定如下表达式: 2 * 6^( log(123) - sin(7)^cos(2) ) lim( (5x^2) / x , x -> 1) . . . 在java或C++中有什么(默认函数,外部库)吗?< /p> < p>你可以这样做…< /P> import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public cla
2 * 6^( log(123) - sin(7)^cos(2) )
lim( (5x^2) / x , x -> 1)
.
.
.
在java或C++中有什么(默认函数,外部库)吗?< /p> < p>你可以这样做…< /P>
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
Java函数
如果你真的想从头开始,重新发明weel,我建议你建立自己的eval函数。这是一个很好的起点:。这不是一个Java域问题,而是一个语言解析问题。实现这一点的传统方法是构建一个lexer和parser,有时使用另一种语言,用您想要的语言生成代码。通过这种方式,您可以将解析关注点从实际的“客户机”程序关注点中分离出来 从长远来看,这比试图编写一个非常复杂的正则表达式状态机要容易得多,因为很难证明它在所有情况下都是正确的。中缀数学解析器/处理器非常有趣,有了“小语言”版本的规则和定义,就更容易证明您的程序是正确的 在爪哇中,你可能想考虑ANTLR来生成解析器,尽管我承认我从来没有使用过它。但我的理解是,如果您使用过Lex&Yacc,那么ANTLR就足够熟悉了 [更新]
我不知道中缀是否是一个硬性要求,但是如果您不想生成解析器,那么使用堆栈和后缀操作解析复杂的数学可能更容易实现。作为额外的奖励,这让你可以像尤达一样做数学。如果你的表达式不是很复杂,我认为这个答案将指导你正确的方式:
如果您的表达式相当复杂,使用示例中的限制,我建议您查看下面的示例。实现一个简单的表达式解析器和使用下面一些强大的数学库应该更容易。一般来说,您需要的是一个。我不知道你有什么要求,但至少有两种方法可以满足 (1) 将你的程序链接到一个库来做代数的事情。对于C++,你可以试试Python,你可以试试。对Java一无所知 (2) 单独编写程序,并通过套接字与CAS通信。在这种情况下,CAS可以是任何东西,例如,等等。套接字接口的工作量可能比您想象的要少——它肯定比重新实现CAS函数要少得多
我的建议是,在不了解您的需求的情况下,用Python编写程序并使用Symphy。是的,lim的意思是limit@Christian他想评估数学表达式。与正则表达式无关。那么这是否意味着x->1?这是你的问题吗@你想要一个用于符号计算的CAS(计算机代数系统)吗。java和C++都有,但是从中选择可能更适合。是的,酷。但是这个例子的计算限制是什么呢?这些数学计算不能用Java本身来完成吗?Java本身就可以完成这些计算,我提供了一个可以用Java来使用的解决方案,我知道它可能会带来的开销。这是一个例子@无论如何,你不能用有限状态机解析乔姆斯基2型语法;我甚至不知道有一个实际的限制,除了它会很混乱和难以验证之外。你可以使用Jython在JVM中运行Python。