seq 和 == 运算符的神秘行为。精度问题?

2024-02-01

我遇到了该函数的某种奇怪(或只是出乎意料?)的行为seq。 创建简单序列时,某些值无法与 == 运算符正确匹配。 看这个最小的例子:

my.seq <- seq(0, 0.4, len = 5)
table(my.seq)                  # ok! returns  0 0.1 0.2 0.3 0.4 
                               #              1   1   1   1   1 

which(my.seq == 0.2)           # ok! returns  3
which(my.seq == 0.3)           # !!! returns  integer(0)

不过,当手动创建序列时,它似乎有效:

my.seq2 <- c(0.00, 0.10, 0.20, 0.30, 0.40)

which(my.seq2 == 0.3)           # ok! returns  4

你对此有什么解释吗?我通过使用解决了这个问题which(round(my.seq, 2) == 0.3)但我对造成问题的原因感兴趣。

预先感谢您的评论。


计算机不能很好地表示浮点数。作为大多数人在计算机上处​​理数字的主要方式,电子表格隐藏这一点的总体趋势导致了许多问题。

切勿与精确的浮点值匹配。 R 中有一些函数可以处理这个问题(例如all.equal)但我更喜欢以下内容。

假设您有一个未知的浮点变量 A,并且您想查看它是否等于 0.5。

abs(A - 0.5) < tol

将容差设置为您需要的接近 0.5 的程度。例如,tol <- 0.0001可能适合你。

如果你的值看起来应该是整数。或者,如果您知道要测试的小数位数,则可以四舍五入到该小数位数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

seq 和 == 运算符的神秘行为。精度问题? 的相关文章

随机推荐