比较数学表达式

mon*_*res 6 java algorithm math floating-point parsing

所以这是我的情况:我有两个包含变量(x,y,z等)的数学表达式.我已经使用shunting yard算法将它们编译为postfix ,现在我需要一种方法来测试它们是否在数学上相等.

例子:

x+5==5+x
x*2==x+x
4/(x/2)==8/x
Run Code Online (Sandbox Code Playgroud)

我最初的想法是抛出几千个不同的随机输入,看看评估结果是否相同.

我用这种方法预见的问题:精度问题,NaN情况和可能的溢出.

所有计算都使用Java的double类型完成.

有任何想法吗?:)

编辑:因为这是一个休闲游戏,解决方案不需要是完美的,只有足够好!

mcd*_*lla 5

对于您提供的示例表达式,您可以将函数转换为生成一个除以另一个的多项式,其中除数的最大有效系数为1,并且没有公因子.这会给你一个规范的形式 - 如果存在差异,这两个函数真的会有所不同.但是,您还需要将系数表示为任意精度的有理数或在此处遇到精度问题,然后您将编写大部分基本的计算机代数系统,例如http://en.wikipedia.org上列出的那些系统./ wiki/List_of_computer_algebra_systems - 其中包括一些免费系统.


nel*_*shh 4

根据 Wikipidea 关于该主题的说法:

http://en.wikipedia.org/wiki/Symbolic_computation

“数学表达式有两种相等的概念。句法相等是表达式的相等,这意味着它们以相同的方式编写(或在计算机中表示)。由于微不足道,数学家很少考虑它,但它是唯一易于用程序测试的等式。语义等式是指两个表达式表示同一个数学对象,例如

众所周知,如果表达式中允许使用指数和对数,则可能不存在一种算法来确定表示数字的两个表达式在语义上是否相等。因此,(语义)等式只能在某些类别的表达式(例如多项式和有理分数)上进行测试。

为了测试两个表达式的相等性,而不是设计特定的算法,通常将它们放入某种规范形式或将它们的差异放入规范形式并测试结果的语法相等性。”

这似乎是最好的做法。