使用eps进行双重比较来解释此行为

时间:2016-05-30 08:59:49

标签: matlab double precision

以下是数据:

probs_caseA_1 = reshape([0.06285693429791894300 ],[1  1]);
probs_caseA_2 = reshape([0.06285693429791905400 ],[1  1]);
probs_caseB_1 = reshape([0.93714306570208106000 ],[1  1]);
probs_caseB_2 = reshape([0.93714306570208095000 ],[1  1])

caseAcaseB是两个相互排斥的事件,因此它们的概率总和为1:

>> probs_caseA_1 + probs_caseB_1 - 1 <= eps(1)

ans =

     1

>> probs_caseA_2 + probs_caseB_2 - 1 <= eps(1)

ans =

     1

后缀_1_2表示生成案例A和B概率的两种不同方式。当然,从概念上讲,对于案例A和案例B,两个概率是相同的。

为什么在进行此比较时会出现以下行为:

abs(probs_caseA_1 - probs_caseA_2) <= ...
    max(eps(probs_caseA_1), eps(probs_caseA_2))

abs(probs_caseB_1 - probs_caseB_2) <= ...
    max(eps(probs_caseB_1), eps(probs_caseB_2))

给出:

>> abs(probs_caseA_1 - probs_caseA_2) <= ...
    max(eps(probs_caseA_1), eps(probs_caseA_2))

ans =

     0

>> abs(probs_caseB_1 - probs_caseB_2) <= ...
    max(eps(probs_caseB_1), eps(probs_caseB_2))

ans =

     1

请注意,这是说情况B的概率是相同的但情况A的情况不是,无论方法1还是2都用于计算它,但我们已经证明案例A和案例的总和B概率(机器)等于1.

1 个答案:

答案 0 :(得分:0)

您的变量&#34; caseA&#34;在小数点后面有更多的零。因此eps(caseA)eps(caseB)不会给你相同的价值! eps(x)返回从abs(x)到下一个与x相同精度的较大浮点数的正距离。

eps(caseA) < eps(caseB) 

但是

(probs_caseA_1 - probs_caseA_2) = (probs_caseB_1 - probs_caseB_2)

因此,您的两个abs(...) <= max(...)可能会产生不同的结果

如果你试着写,你会注意到区别:

eps(0.01)
eps(0.001)

每次添加零时,您将更接近下一个更大的浮点数。

您可以阅读this article了解更多详情