Rei*_*ica 5 floating-point precision r floating-accuracy
我正在研究一些编程问题,我必须在标准空间和对数空间之间转换概率。为此,我试图找出输入为对数概率(即非正数)的计算中浮点误差的最大绝对误差。Rlog(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
Run Code Online (Sandbox Code Playgroud)
.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
Run Code Online (Sandbox Code Playgroud)
然而,一旦你的x非常大,你就会Inf出错,例如,
> (x <- .Machine$double.xmax)
[1] 1.797693e+308
> max(abs(log(exp(x)) - x))
[1] Inf
Run Code Online (Sandbox Code Playgroud)