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

标签 r precision seq

我遇到了函数 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可能对你没问题。

如果您的值看起来像它们应该是整数。或者,如果您知道要测试的十进制级别,则可以四舍五入到该十进制级别。

关于r - seq 和 == 运算符的神秘行为。精度问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11742556/

相关文章:

r - 如何根据条件进行累计计数?

替换 na.locf.xts(与多列 xts 一起使用时速度极慢)

c++ - 将 dnorm 与 RcppArmadillo 结合使用

ios - NSDecimalNumber 计算错误

math - float 学有问题吗?

java - 如何将类 java Iterator 对象转换为 clojure 序列

R:多元时间序列的滚动排名?

f# - 在 F# 序列中复制列表项 n 次

list - 为什么 Seq.tail 不是一个选项

阶乘的精度运算和溢出