==在R中,使用.Machine $ double.eps准确度

时间:2017-11-10 10:50:42

标签: r floating-point

在R中,我发现转换易于阅读的代码有点烦人,例如:

if (det(A) == 1)       # not always working because of floating point precision
    ...

if (abs(det(A) - 1) < .Machine$double.eps)     # working but bad for readability
    ...

问题:R中是否有内置运算符测试值是否等于“.Machine$double.eps错误”?类似的东西:

if (det(A) ==~ 1)       # TRUE even if det(A) = 1 + 1e-17
    ...

2 个答案:

答案 0 :(得分:2)

一种方法是像这样声明一个函数%=~

`%=~%` <- function(x, y, tol = .Machine$double.eps^0.5) abs(x - y) < tol

2 %=~% (2+1e-15)
#[1] TRUE

然后,您可以使用您选择的容差tol

答案 1 :(得分:1)

我认为@Patricia正在做的事情是这样的

xx <- seq(0, 5e4, length.out=3e2)
dif <- Re(fft(fft(xx), inverse=TRUE)/length(xx)) - xx

plot(dif, type="p", pch=16, cex=0.8)
max(abs(dif))
# 4.365575e-11

.Machine$double.eps

还有很长的路要走

尽管如此,中缀运算符可以像这样实现

`%zeq%` <- function(lhs, rhs) {
    isTRUE(all.equal(lhs, rhs, tolerance = 1e-10))
}

2 %zeq% (2+1e-10)

有点选择Rob Eastaways的'zequals'。