我在R 3.1.2中运行了以下代码:
> 7 - (.05+.1)/.05
[1] 4
> rep(NA, 4)
[1] NA NA NA NA
> rep(NA, 7 - (.05+.1)/.05)
[1] NA NA NA
请注意,即使rep
,上一次7 - (.05+.1)/.05 = 4
调用也会返回3个NAs而不是4个。其他人可以复制同样的错误吗?对它有一个简单的解释吗?
答案 0 :(得分:2)
7.31为什么R不认为这些数字相等?
可以用R的数字类型精确表示的唯一数字是整数和分数,其分母是2的幂。其他数字必须四舍五入到(通常)53二进制数字精度。结果,两个浮点数不会可靠地相等,除非它们已经由相同的算法计算,并且即使那时也不总是如此。例如
R> a <- sqrt(2) R> a * a == 2 [1] FALSE R> a * a - 2 [1] 4.440892e-16
函数all.equal()使用.Machine $ double.eps ^ 0.5的数字容差来比较两个对象。如果你想要比这更精确,你需要仔细考虑错误传播。
如果你期望结果是一个整数,你可以使用round
函数强制它是一个完美的结果:
7L - (.05+.1)/.05 == 4
[1] FALSE
round(7L - (.05+.1)/.05) == 4
[1] TRUE