2017-10-14 50 views
1

经过一系列浮点算术运算后,是否存在小于等于浮点数的等值比较的“最佳做法”?加法和减法后的浮点和小于等于

我在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 $

+0

如果您想更详细地介绍这一点,Donald knuth的计算机编程艺术,第3章对漂浮点的黑色艺术进行了很好的概述。在R中,我们有'all.equal'作为测试近似等式的方式。所以你可以使用像'(x dww

+0

我知道'all.equal'函数。缺省值是scale = NULL(缺省值)的_Numerical比较通常是在相对差分尺度上,除非目标值接近零:首先,计算两个数值向量的平均绝对差值。如果这小于容差或不是有限的,则使用绝对差异,否则相对差异由平均绝对目标值缩放。其中'tolerance'默认为'sqrt(.Machine $ double.eps)'。我不确定这是否是一种常见做法? –

回答

5

不,没有最佳实践。不可能,因为几乎所有的浮点计算都会引入一些舍入误差,并且对于不同的应用程序,误差的后果是不同的。

通常,软件将执行一些计算,但是,由于舍入误差(或其他问题),会产生近似值x'。当比较浮点数,你要问一些问题有关X,如“是X < 1?”或“X = 3.1415926 ......?”所以,你要解决的问题是“如何我用X“来回答这个问题有关X?”

没有通用的解决方案这一点。即使小于1,某些错误可能会产生大于1的“x”。即使x大于1,某些错误可能产生小于1的'。任何具体实例取决于在计算x'时生成的错误信息以及要回答的具体问题。

有时候一个全面的分析可以证明某些关于x的问题可以用x'来回答。例如,在某些情况下,我们可以让我们知道手艺计算,如果X '< 1,然后X < 1.或许,如果X' < 0.99875,然后X < 1。假设我们分析了我们用于计算的计算结果x',并且可以显示最终的误差小于.00125。然后,如果X '< 0.99875,那么我们就知道X < 1,并且,如果X'> 1.00125,然后X> 1。但是,如果0.99875 < X“< 1.00125,那么我们不知道是否x> 1或x < 1.我们在那种情况下做什么?对于你的应用程序来说,更好的方式是采取x < 1或者路径x> 1的路径吗?答案是针对每个应用程序的,并且没有一般的最佳实践。

我会补充说明,发生的舍入误差的数量在应用程序和应用程序之间差别很大。这是因为四舍五入错误可以以各种方式混合。一些具有少量浮点运算的应用程序将会以小错误达到结果。一些具有许多浮点运算的应用程序也会以适度的错误达到结果。但某些行为会导致计算错位并产生灾难性错误。所以处理舍入错误是每个程序的自定义问题。

+0

这就是我所想的。虽然,这确实很好。 –