【发布时间】:2011-10-15 14:56:06
【问题描述】:
这是一些基本代码及其输出。除了对包含 1.2 的序列的逻辑测试给出不准确的结果外,我真的无话可说。它适用于许多其他价值。
# Incorrect
> seq(0.5, 1.5, by=0.05) == 1.2
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# Correct
> seq(0.5, 1.5, by=0.05) == 1.15
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# Correct
> seq(0.5, 1.5, by=0.05) == 1.25
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
# Correct
> seq(0.5, 1.5, by=0.05) == 1.3
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
我尝试使用以下方法测试所有值,但没有重现错误:
> sapply(seq(0.5, 1.5, by=0.05), function(x){sum(seq(0.5, 1.5, by=0.05) == x)})
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我使用的是 R 版本 2.13.2 (2011-09-30),平台:x86_64-pc-linux-gnu(64 位)。
【问题讨论】:
-
这不是错误,这是使用浮点算法来表示数字的结果。您应该使用
all.equal而不是==来测试是否相等。这个问题已在 SO 上被问过几次 - 我将尝试找到它们并发布链接。 -
这是我的猜测。但我认为其他值也会出现同样的问题,不是吗?另外,
all.equal在这里不起作用,因为我想找到等于 1.2 的值(我在which()中进行了这个测试)。 -
它也在 R-FAQ 中。您可能想阅读整个文档。从长远来看,它应该可以为您节省一些时间(也许还有一些尴尬)。
-
您可以使用
Vectorize创建all.equal的矢量化版本,然后使用which(all.equal.vec(...) == TRUE)。
标签: r