在一系列浮点算术运算之后,是否存在与浮点数进行小于等于比较的“最佳实践”?
我在 R 中有以下示例(尽管该问题适用于任何使用浮点的语言)。我有一个双倍x = 1
,我在上面应用了一系列加法和减法。最后x
应该是一个,但不是由于浮点运算(据我收集)。这是示例:
> stop_times <- seq(0.25, 2, by = .25)
> expr <- expression(replicate(100,{
x <- 1
for(i in 1:10) {
tmp <- rexp(1, 1)
n <- sample.int(1e2, 1)
delta <- tmp / n
for(j in 1:n)
x <- x - delta
x <- x + tmp
}
# "correct" answer is 4
which.max(x <= stop_times)
}))
> eval(expr)
[1] 5 5 5 4 4 4 5 5 5 4 5 4 4 4 5 5 4 4 5 4 5 4 5 4 5 5 5 4 4 4 4 4 4 4 4 4 5 5 5 5 5 4 5 4 5 5 5 4 4 5 5 5 4 4 5 5 5 4 4 4 4 4 4
[64] 5 4 4 4 5 5 5 4 4 4 5 4 4 4 4 4 4 4 4 5 5 5 5 4 4 4 5 5 5 5 5 4 4 4 5 5 4
一个(天真的?)解决方案是在不等式的右侧添加一些任意小的正数,如下所示
some_arbitrary_factor <- 100
stop_times <- seq(0.25, 2, by = .25) +
some_arbitrary_factor * .Machine$double.eps
eval(expr)
[1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[64] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
这是“最佳实践”吗?如果是,是否有关于如何选择的指南 some_arbitrary_factor
?
我的具体问题是,我有时间段(t_0, t_1], (t_1, t_2], ...
,需要找出给定观察x
的时间段。在经历了一系列浮点算术运算后,x
可能已经将边界设置为一个边界,这应该导致精确运算在哪里执行。t_i
t_i