检查差异是否小于机器精度的正确/标准方法是什么?

问题描述 投票:25回答:1

我经常遇到必须检查所获得的差异是否高于机器精度的情况。为此,似乎R具有一个方便的变量:.Machine$double.eps。但是,当我转向R源代码获取有关使用此值的准则时,会看到多种不同的模式。

示例

以下是stats库中的一些示例:

t.test.R

if(stderr < 10 *.Machine$double.eps * abs(mx))

chisq.test.R

if(abs(sum(p)-1) > sqrt(.Machine$double.eps))

integrate.R

rel.tol < max(50*.Machine$double.eps, 0.5e-28)

lm.influence.R

e[abs(e) < 100 * .Machine$double.eps * median(abs(e))] <- 0

princomp.R

if (any(ev[neg] < - 9 * .Machine$double.eps * ev[1L]))

问题

  1. [如何理解所有这些10 *100 *50 *sqrt()修饰符背后的原因?
  2. 是否存在关于使用.Machine$double.eps来调整由于精度问题引起的差异的准则?
r floating-point rounding precision
1个回答
0
投票

[machine.eps的定义:它是eps不是1+eps]的最小值[C0

根据经验(假设以2为底的浮点表示形式:该1使范围1..2有所不同。对于范围2 .. 4的精度为eps等等。

不幸的是,这里没有良好的经验法则。这完全取决于您程序的需求。

在R中,我们具有all.equal作为测试近似相等性的内置方式。所以您可以使用2*eps

之类的东西

Google模拟具有多个(x<y) | all.equal(x,y用于双精度比较,包括floating point matchersDoubleEq。您可以像这样在数组匹配器中使用它们:

DoubleNear
© www.soinside.com 2019 - 2024. All rights reserved.