【发布时间】:2013-09-18 14:27:46
【问题描述】:
我正在阅读The R Inferno,但遇到了一些我不明白的事情。除了 Inferno 中的第 8.2.23 节,还有一些关于比较浮点数的好问题:question1、question2。
但是,我在使用 all.equal 时仍然遇到问题。使用默认的all.equal,我得到的结果(大部分)符合我的预期。
> all.equal(2,1.99999997)
[1] "Mean relative difference: 1.5e-08"
> all.equal(2,1.99999998) #I expected FALSE here
[1] TRUE
> all.equal(2,1.99999999)
[1] TRUE
我不确定为什么函数在 1.99999998 处返回 TRUE,但这并不像我指定容差级别的以下行为那样令人担忧:
> all.equal(2,1.98,tolerance=0.01) #Behaves as expected
[1] "Mean relative difference: 0.01"
> all.equal(2,1.981,tolerance=0.01) #Does not behave as expected
[1] TRUE
此外,
> all.equal(2,1.980000000001,tolerance=0.01)
[1] TRUE
但是如果我们计算:
> diff(c(1.981,2))
[1] 0.019
很明显,
> diff(c(1.981,2)) >= 0.01
[1] TRUE
那么,为什么all.equal 无法区分容差为 0.01 的 2 和 1.981?
编辑
来自文档:scale = NULL(默认值)的数值比较是通过首先计算两个数值向量的平均绝对差来完成的。如果这小于容差或不是有限的,则使用绝对差,否则使用平均绝对差缩放相对差。
这里我不明白这种行为。我可以看到diff(1.981,2) 不是有限的:
> sprintf("%.25f",diff(c(1.981,2)))
[1] "0.0189999999999999058530875"
那么它是通过什么来缩放的呢?当每个向量的长度为1时,平均绝对差应该等于两个数字的差,除以平均绝对差会得到1。显然,我理解这里的逻辑是错误的。
【问题讨论】:
-
来自帮助文件:
all.equal(x, y)是一个用于比较 R 对象 x 和 y 测试“近似相等”的实用程序(注意:near ) -
is.finite表示哪些元素是有限的(不是无限的且不会丢失)或无限的(如Inf和-Inf,不重复小数!
标签: r