我正在尝试构建一个表达式解析器来评估数学表达式的值。然而,问题在于某些类别的表达式的计算结果为无理数。
让我们举一个例子,例如(√2)²
这应该计算为 2
。但是,由于程序编码的逻辑,它返回一个小数点数字。
首先计算√2
,其等于1.4142135
,然后将结果平方,得到1.9999998
目前只能将表达式发送至 Mathematica通过 JLink然后使用结果。然而,这需要第三方软件的帮助。
我想知道这整个事情是否可以用java实现。
最佳答案
是的,您当然可以用 Java 实现表达式解析器。我认为你的根本错误不在于Java编程,而在于程序设计。
您不应该尽可能晚地评估 Surd。相反,您应该将 (sqrt(n))^2
等表达式评估为 sqrt(n)*sqrt(n)
和 sqrt(n)*sqrt( n)
到 n
。只有这样,您才应该考虑将 n
转换为等效的 float 。
您所确定的方法中的错误是浮点算术的一个功能,您将很难与之对抗。更好的策略是通过对符号表达式实现符号操作来解决这个问题。
关于java - JAVA中符号数学的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13515761/