如何最好地处理R中的二进制浮点错误?

时间:2017-12-01 15:09:55

标签: r error-handling precision

这是以前讨论过的常见问题,并且很好地解释了HERE

然而,我发现的所有答案都解释了处理平等的不同方法,但我不认为它们中的任何一个在代码中特别好或可读,最重要的是不能用于其他运营商as<,>,< =,> =或! (不)。

我的优先方法是使用舍入,但仅用于下面的比较。

> options(digits = 20)
> x <- cbind(c(1:10)/100*9,c(1:10)/10,c(1:10)/100)
> x
                      [,1]                [,2]                 [,3]
 [1,] 0.089999999999999997 0.10000000000000001 0.010000000000000000
 [2,] 0.179999999999999993 0.20000000000000001 0.020000000000000000
 [3,] 0.270000000000000018 0.29999999999999999 0.029999999999999999
 [4,] 0.359999999999999987 0.40000000000000002 0.040000000000000001
 [5,] 0.450000000000000011 0.50000000000000000 0.050000000000000003
 [6,] 0.540000000000000036 0.59999999999999998 0.059999999999999998
 [7,] 0.630000000000000115 0.69999999999999996 0.070000000000000007
 [8,] 0.719999999999999973 0.80000000000000004 0.080000000000000002
 [9,] 0.809999999999999942 0.90000000000000002 0.089999999999999997
[10,] 0.900000000000000022 1.00000000000000000 0.100000000000000006

> x[,1]==x[,2]-x[,3]
 [1] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE
> round(x[,1],15)==round(x[,2]-x[,3],15)
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> round(x[,1],15)<=round(x[,2]-x[,3],15)
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

舍入精确限制可以获得良好的结果,并且可以与其他操作员一起工作,对我来说似乎比其他函数更容易阅读,但我认为有时候它仍然会导致它自己的错误。

是否有最佳实践方法来处理这种紧凑且易于阅读的错误,并且可以与多个操作员一起使用?

甚至更好,是否有可能拥有一组替代运算符,例如~==~<=,它们会自动舍入精确限制,以便我不需要经常考虑它们?

修改 为了更好地解释我为什么问这个问题,这不仅仅是处理平等问题。已经回答了。

但是,从第3行0.270000000000000018 > .270.29999999999999999 > .3以及0.029999999999999999 < .03中的示例开始。但总和是0.30000000000000004而不是0.29999999999999999所以这些情况是&lt;和&gt;也将破裂,因为价值可以任意变为&lt;或&gt;。

在这种情况下,我会添加或减去一个小值.27 + .02 < .3 +.000001,但这个值总是会根据具体情况而变化,甚至会根据使用情况而变化。

我正在处理我正在进行比较的数据,并且我经常看到与&lt;和&gt;我不得不经常进行代码调整来处理它。我想要一些东西,以便我不需要添加太多额外的代码来处理这个问题。

0 个答案:

没有答案