在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
...
答案 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'。