经过一系列浮点算术运算后,是否存在小于等于浮点数的等值比较的“最佳做法”?加法和减法后的浮点和小于等于
我在R中有下面的例子,虽然这个问题不仅适用于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
A(幼稚?)解决方案是一些任意小的正数增加了不平等的右侧如下
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),\ dots $,并且需要查找给定观察值$ x $在哪个周期内。$ x $在进行了一系列浮点算术运算后,可能已经被设置为一个边界$ t_i $,如果执行了精确操作,结果应该是$ t_i $
如果您想更详细地介绍这一点,Donald knuth的计算机编程艺术,第3章对漂浮点的黑色艺术进行了很好的概述。在R中,我们有'all.equal'作为测试近似等式的方式。所以你可以使用像'(x
dww
我知道'all.equal'函数。缺省值是scale = NULL(缺省值)的_Numerical比较通常是在相对差分尺度上,除非目标值接近零:首先,计算两个数值向量的平均绝对差值。如果这小于容差或不是有限的,则使用绝对差异,否则相对差异由平均绝对目标值缩放。其中'tolerance'默认为'sqrt(.Machine $ double.eps)'。我不确定这是否是一种常见做法? –