在天花板上修复浮点不精确

时间:2014-12-24 22:49:23

标签: r floating-point floating-point-precision ceil

问题:

ceiling(31)
#31
ceiling(31/60*60)
#32

解决此类错误的正确方法是什么?

在除法之前进行乘法不是一个选项,我的代码看起来像这样:

x <- 31/60
...
y <- ceiling(x*60)

我正在考虑做一个新功能:

ceil <- function(x) {
  ceiling(signif(x))
}

但我是R的新手,也许有更好的方法。

更新
抱歉,我没有提供更多详细信息,出于不同的原因,我在代码的不同部分遇到了同样的问题,但总是有上限。

我知道浮点计算中的舍入误差。也许问题的标题可以改进,我不想修复天花板功能的不精确,我想要做的可能是相反的,使天花板不那么准确。告诉R忽略明显噪音的数字的方法:

options(digits=17)
31/60*60
#31.000000000000004

但是,显然,忽略噪声数字所需的epsilon取决于问题的背景。

1 个答案:

答案 0 :(得分:1)

我坚信,这里的真正问题出现在我的英雄The Data Munger Guru的标语中,即:“你要解决的问题是什么? 告诉我你想做什么,而不是你想怎么做。 “

有无数种情况,浮点精度会导致明显的整数变成“整数+/- epsilon”,所以你需要弄清楚你为什么选择“天花板”,为什么你允许你的值不是整数等等。 - 或多或少是Pascal Cuoq在评论中写的。

因此,您关注的解决方案取决于实际发生的情况。也许你想要,说trunc(x/60)->y跟着trunc(y*60),或者不是:-)。也许你想要y<-round(x/60*60) +1,或jhoward的建议方法。正如我在此强调的那样,这取决于你的目标是什么以及你想如何处理角落案件。