产品和浮点

use*_*827 0 r

我正在复制纸张部分的计算部分......

prod(c(0.44, 0.26, 0.21, 0.35, 0.37, 0.42, 0.35, 0.45, 0.34, 0.39, 
0.33, 0.38, 0.26, 0.42, 0.22, 0.22, 0.47))
Run Code Online (Sandbox Code Playgroud)

这使,

8.500645e-09
Run Code Online (Sandbox Code Playgroud)

但是,该报告将此值报告为

8.13e-09
Run Code Online (Sandbox Code Playgroud)

在整个计算中存在其他差异的例子,例如这个(另一个prod()计算,lm()需要斜率和截距以供后续使用,其结果给出略微不同的结果).

我怀疑我正在考虑浮点差异,但我怎么能确定?如果是浮点差异,我需要进一步的信息来更精确地重现计算?

ps我已经阅读了关于浮点运算的stackoverflow上的帖子.

42-*_*42- 5

似乎不太可能只有17个项目的浮点错误可能传播到5%差异的程度,除非数据被舍入显示但在计算中没有舍入.但是,如果基础值可能与显示器的差异高达0.005,那么我认为这可能是"浮点问题"或更准确地说是由舍入操作引起的错误传播.

var <- c(0.44, 0.26, 0.21, 0.35, 0.37, 0.42, 0.35, 0.45, 0.34, 0.39, 
          0.33, 0.38, 0.26, 0.42, 0.22, 0.22, 0.47) 

> prod(var+runif(17, -0.005, 0.005) )
[1] 8.483948e-09
> prod(var+runif(17, -0.005, 0.005) )
[1] 8.778634e-09
> prod(var+runif(17, -0.005, 0.005) )
[1] 8.351511e-09
> prod(var+runif(17, -0.005, 0.005) )
[1] 8.113381e-09
> prod(var+runif(17, -0.005, 0.005) )
[1] 8.224519e-09
> prod(var+runif(17, -0.005, 0.005) )
[1] 8.664986e-09


set.seed(101)
rr <- replicate(1000,prod(var+runif(17, -0.005, 0.005)))
par(las=1,bty="l")
hist(rr,breaks=50,col="gray")
abline(v=c(8.5e-9,8.13e-9),col=c(2,4),lwd=2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述