执行数学运算时,Mexed 函数的差异非常小
Posted
技术标签:
【中文标题】执行数学运算时,Mexed 函数的差异非常小【英文标题】:Mexed function gives very slight difference when performing math 【发布时间】:2014-10-09 19:39:43 【问题描述】:因此,我使用 MATLAB 的 Coder 工具包尝试了矩阵指数函数,并构建了它。我继续测试,看看结果是否可靠和更有效。虽然代码更快,但它产生的答案非常轻微。
我运行了原始函数并得到了答案:
p =
1 0 0 0 0 0 0 0 0 0 0 0
-0.05 1 -1.25e-07 5e-06 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
1.25e-07 -5e-06 -0.05 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 -0.05 1 0 0 0 0 0 0
-2.0833e-05 0.00125 -5.2083e-11 4.1667e-09 0 0 1 0.05 0 1.25e-07 0 0
-0.00125 0.05 -4.1667e-09 2.5e-07 0 0 0 1 0 5e-06 0 0
5.2083e-11 -4.1667e-09 -2.0833e-05 0.00125 0 0 0 -1.25e-07 1 0.05 0 0
4.1667e-09 -2.5e-07 -0.00125 0.05 0 0 0 -5e-06 0 1 0 0
0 0 0 0 -2.0833e-05 0.00125 0 0 0 0 1 0.05
0 0 0 0 -0.00125 0.05 0 0 0 0 0 1
然后我用相同的输入运行了函数的混合版本:
p2 =
1 0 0 0 0 0 0 0 0 0 0 0
-0.05 1 -1.25e-07 5e-06 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
1.25e-07 -5e-06 -0.05 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 -0.05 1 0 0 0 0 0 0
-2.0833e-05 0.00125 -5.2083e-11 4.1667e-09 0 0 1 0.05 0 1.25e-07 0 0
-0.00125 0.05 -4.1667e-09 2.5e-07 0 0 0 1 0 5e-06 0 0
5.2083e-11 -4.1667e-09 -2.0833e-05 0.00125 0 0 0 -1.25e-07 1 0.05 0 0
4.1667e-09 -2.5e-07 -0.00125 0.05 0 0 0 -5e-06 0 1 0 0
0 0 0 0 -2.0833e-05 0.00125 0 0 0 0 1 0.05
0 0 0 0 -0.00125 0.05 0 0 0 0 0 1
乍一看,这两个矩阵是相等的,但实际上它们相差甚远:
p-p2
ans =
0 0 0 0 0 0 0 0 0 0 0 0
-6.9389e-18 0 0 8.4703e-22 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
-3.3881e-21 -2.1684e-19 -3.2312e-26 8.2718e-25 0 0 0 0 0 5.294e-23 0 0
-2.1684e-19 0 -8.2718e-25 5.294e-23 0 0 0 0 0 8.4703e-22 0 0
6.4623e-27 0 -3.3881e-21 2.1684e-19 0 0 0 0 0 0 0 0
0 0 0 6.9389e-18 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
大部分结果与原来的函数是等价的,但有些不是。此外,两者之间的差异是如此之小,以至于我无法相信这将是一个数学错误,而不是一个精度错误。而我之所以如此关心这个,是因为这确实会导致我使用该功能的重叠原因出现问题。
mex 功能关闭这么少有什么原因吗?有没有办法解决这个问题?
【问题讨论】:
必填链接:floating-point-gui.de 【参考方案1】:您观察到的差异非常小,您可以认为结果实际上是相同的。
它们的计算方式不同,这就是为什么您不会得到完全相同相同的结果。然而,差异大致是machine epsilon
,这仅仅是因为计算机不能以无限精度工作,而是用一些离散的数字表示。
【讨论】:
可能值得注意的是,C 需要在内部执行与 matlab 不同的数组计算步骤,这可以解释差异。否则 + 1 @sobek 有没有办法解决这个问题?我的程序可能会运行这个函数数十万次,以至于如此微小的差异可能会真正产生影响。 别担心,它不会的:) 您不应该将浮点数与相等性进行比较,但您应该检查绝对/相对差异是否小于某个可接受的容差...如果您的应用程序确实关心舍入错误这么大,那么您可能应该考虑使用arbitrary-precision 库。 不仅仅是它们不同,而且两者都与“真实”答案不同。 Matlab 的答案并不比 mex-ed 的答案更正确。如果这么小的错误真的有影响,你应该考虑尝试改变你的算法来改善条件。如果不使用某种任意精度的方法,您将永远无法减少错误。以上是关于执行数学运算时,Mexed 函数的差异非常小的主要内容,如果未能解决你的问题,请参考以下文章