【问题标题】:Explain this behaviour with usage of eps for double comparison使用 eps 进行双重比较来解释这种行为
【发布时间】:2016-05-30 08:59:49
【问题描述】:

这是数据:

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。

【问题讨论】:

    标签: matlab double precision


    【解决方案1】:

    变量“caseA”的小数点后有更多零。所以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(...) &lt;= max(...) 可能会给出不同的结果

    如果你尝试写作,你会注意到不同之处:

    eps(0.01)
    eps(0.001)
    

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 2012-03-16
      • 2012-12-20
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      相关资源
      最近更新 更多