我有一个在两个平台上成功开发的.NET项目:Windows和Ubuntu(Mono)。这是非常以数学为导向的,即使一切按预期工作,我们确实发现了影响13或14位小数的结果的一些差异。由于我们有一些自动化测试来验证算法的正确性,因此会因数字差异而失败。
经过大量研究后,我们将问题解决为Math.Exp
,在两个平台上为相同的输入提供不同的结果。结果不是100%不一致,但即使是某些输入的最微小的差异也会产生我们的测试检测到的最终输出差异。
首先,这种略有不同的行为会是什么原因?是不是Math.Exp
直接在CPU上执行?顺便说一下,这两个平台都是基于英特尔的。
如果无法纠正(我不知道它是怎么回事),我们可以在两个平台上使用替代Exp
实现(与Math.Exp
一样快)吗?
我知道我们可以使用Math.Pow(Math.E, x)
,但快速搜索显示这比Math.Exp
慢2倍。此外,它可能会遇到同样的问题。