修复上限中的浮点不精确问题

pom*_*ber 5 floating-point r ceil floating-point-precision

问题:

ceiling(31)
#31
ceiling(31/60*60)
#32
Run Code Online (Sandbox Code Playgroud)

修复此类错误的正确方法是什么?

在除法之前进行乘法不是一种选择,我的代码如下所示:

x <- 31/60
...
y <- ceiling(x*60)
Run Code Online (Sandbox Code Playgroud)

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

ceil <- function(x) {
  ceiling(signif(x))
}
Run Code Online (Sandbox Code Playgroud)

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

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

我知道浮点计算中的舍入误差。也许问题的标题可以改进,我不想修复上限函数的不精确性,我想做的也许是相反的,使上限不那么精确。一种告诉 R 忽略明显是噪声的数字的方法:

options(digits=17)
31/60*60
#31.000000000000004
Run Code Online (Sandbox Code Playgroud)

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

Car*_*oft 1

我坚信,这里真正的问题可以在我的英雄数据芒格大师的口号中找到,即:“您想要解决的问题是什么?告诉我您想做什么,而不是您想如何做.”

在很多情况下,浮点精度会导致明显的整数变成“整数+/- epsilon”,因此您需要弄清楚为什么要使用“ceiling”,为什么允许值不是整数,等等 <-- 或多或少是 Pascal Cuoq 在他的评论中写的。

因此,您所关心的问题的解决方案取决于实际发生的情况。也许您想要,说trunc(x/60)->y后面跟着trunc(y*60),或者也许不想:-) 。也许您想要y<-round(x/60*60) +1,或者 jhoward 建议的方法。正如我在这里强调的,这主要取决于您的目标是什么以及您希望如何处理极端情况。