执行数学运算时,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 函数的差异非常小的主要内容,如果未能解决你的问题,请参考以下文章

vb 的取余运算符是怎么算的

canvas绘图数学知识总结

利用ScriptEngineManager实现简单的规则运算

c语言中的反函数怎么计算?

Python函数:内置函数(数学运算函数类型转换函数)

MySql