【发布时间】:2018-03-26 03:50:10
【问题描述】:
在一系列浮点算术运算之后与浮点数进行小于等于比较是否有“最佳实践”?
我在 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。
【问题讨论】:
-
如果您想更详细地了解这一点,Donald knuth 的计算机编程艺术,第 3 章很好地概述了浮点的黑魔法。在 R 中,我们有
all.equal作为测试近似相等性的内置方法。所以你可以使用类似(x<y) | all.equal(x,y) -
我知道
all.equal函数。默认值是 scale = NULL(默认值)的数值比较通常在相对差异尺度上,除非目标值接近于零:首先,计算两个数值向量的平均绝对差值。如果这小于容差或不是有限的,则使用绝对差,否则按平均绝对目标值缩放相对差。 其中tolerance默认为sqrt(.Machine$double.eps)。我不确定这是否是一种常见做法?
标签: r floating-point floating-accuracy epsilon inexact-arithmetic