我经常遇到必须检查所获得的差异是否高于机器精度的情况。为此,似乎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]))
等
10 *
,100 *
,50 *
和sqrt()
修饰符背后的原因? .Machine$double.eps
来调整由于精度问题引起的差异的准则?[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 matchers和DoubleEq
。您可以像这样在数组匹配器中使用它们:
DoubleNear