經過一系列浮點算術運算後,是否存在小於等於浮點數的等值比較的「最佳做法」?加法和減法後的浮點和小於等於
我在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)'。我不確定這是否是一種常見做法? –