[英]R: Computing maximum floating-point error for log(exp(…))
我正在解決一些必須在標准空間和對數空間之間轉換概率的編程問題。 為此,我試圖找出R
浮點誤差的最大絕對誤差,用於計算log(exp(...))
其中輸入是對數概率(即非正數)。
目前我已經使用網格搜索計算了答案(見下面的代碼和圖),但我不確定我計算的值是否正確。 (我檢查了一些其他范圍,但圖中顯示的范圍似乎獲得了最大絕對誤差。)
#Set function for computing floating-point error of log(exp(...))
fp.error <- function(x) { abs(log(exp(x)) - x) }
#Compute and plot floating-point error over a grid of non-negative values
xx <- -(0:20000/10000)
ff <- fp.error(xx)
plot(xx, ff, col = '#0000FF10',
main = 'Error in computation of log(exp(...))',
xlab = 'x', ylab = 'Floating-Point Error')
#Compute maximum floating-point error
fp.error.max <- max(ff)
fp.error.max
[1] 1.110223e-16
從這個分析中,我估計的最大絕對誤差是.Machine$double.eps
大小的一半(即2.220446e-16
)。 我不確定這是否有理論上的原因,或者我是否得到了錯誤的答案。
問題:有什么方法可以確定這是否真的是此計算的最大浮點誤差? 是否有任何理論方法來計算最大值,或者這種網格搜索方法是否足夠?
我想你得到了正確的答案。 在這里,我將步驟細化為sqrt(.Machine$double.eps)
,你會看到
> x <- seq(0, 2, by = sqrt(.Machine$double.eps))
> max(abs(log(exp(x)) - x))
[1] 1.110725e-16
然而,一旦你的x
非常大,你就會有Inf
錯誤,例如,
> (x <- .Machine$double.xmax)
[1] 1.797693e+308
> max(abs(log(exp(x)) - x))
[1] Inf
log(exp(x))
的誤差取決於x
的值。 如果您使用浮點數,則x 也具有取決於其值的精度。 可以從C
使用nextafter
計算精度:
library(Rcpp)
cppFunction("double getPrec(double x) {
return nextafter(x, std::numeric_limits<double>::infinity()) - x;}")
getPrec(2)
#[1] 4.440892e-16
getPrec(exp(2))
#[1] 8.881784e-16
或不使用Rcpp
:
getPrecR <- function(x) {
y <- log2(pmax(.Machine$double.xmin, abs(x)))
ifelse(x < 0 & floor(y) == y, 2^(y-1), 2^floor(y)) * .Machine$double.eps
}
也看看:檢查差異是否小於機器精度的正確/標准方法是什么? .
一般來說,我建議使用隨機方法來生成更多x
s,例如:
x <- runif(10000000, 0, 2)
您的定期間隔值可能碰巧偶然發現了一種“有效”的模式。
也取決於您是否關心絕對誤差或相對誤差。 絕對誤差應該接近.Machine$double.xmax
而相對誤差隨着x
接近零而增加。 例如log(exp(1e-16))
被截斷為零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.