-1

如果我使用 for 循环向前或向后搜索,则在搜索数组中的某个元素时会得到不同的答案。

示例:给出正确答案的代码

vg   = rep(seq(0.9,1.1,0.01),90)
vals = seq(0.9,1.05,0.01)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}

此代码提供:0.9:90 0.91:90.92:90 0.93:90 0.94:90 0.95:90 0.96:90 0.95:90 0.98:90 0.97:90.98:90.99:90.98:90.99:90 1:90 1.01:90 1.02:90 1.03:90 1.04:90 1.05 : 90

哪个是对的。但是,如果我使用下面的代码更改上面的 vg 变量的序列:

vg   = rep(seq(1.1,0.9,-0.01),90)
vals = seq(0.9,1.05,0.01)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}

我得到如下所示的答案,在搜索 0.96、0.97 等时显示 0 个元素。

0.9:0 0.91:0 0.92:0 0.93:90 0.94:90.95:90 0.96:0 0.97:0 0.98:0 0.99:0 1:90 1.01:90 1.02:90 1.03:90 1.04:90 1.05:90 1.04:90 1.05

为什么会出现这种差异,因为我们在两个代码中搜索完全相同的元素?这是一个R错误吗?

4

1 回答 1

4

为了扩展 Andrie 的评论,这一个浮点问题。引用这本好书,The R Inferno

一旦我们越过阿切伦河,我们就到达了第一个圆环,那里是善良的异教徒的家园。这些人生活在对浮点神的无知中。这些异教徒期望:

.1 == .3 / 3
[1] FALSE  

是真实的。善良的异教徒也会期待:

seq(0, 1, by=.1) == .3
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

有一个正确的值。

在您的示例中,如果我们改为使用整数而不是浮点数,则它可以工作:

vg   = rep(seq(90,110,1),90)
vals = seq(90,105,1)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}

vg   = rep(seq(110,90,-1),90)
vals = seq(90,105,1)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}
90 : 90         91 : 90         92 : 90         93 : 90         94 : 90         95 : 90         96 : 90  

R inferno 是一本非常有趣且内容丰富的读物。我强烈推荐它。

您还可以通过执行以下操作默认查看 WYSINWYG:

options(digits=22)
.3/3
[1] 0.09999999999999999167333
于 2013-03-07T10:38:24.567 回答