簡體   English   中英

R:計算 log(exp(…)) 的最大浮點誤差

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM