R:简单代数和的近似误差
R: approximation error with simple algebraic sums
我的脚本中有一个明显的错误。
几个小时后,我发现这是一个小数近似的问题。
要使问题可重现,请考虑以下事项:
0.02 - 0.000904686260609299 - 0.005 ==
0.02 + (-0.000904686260609299 - 0.005)
#[1] FALSE
其中:
print(0.02 -0.000904686260609299 -0.005, 22)
print(0.02 + (-0.000904686260609299 -0.005), 22)
#[1] 0.01409531373939069964774
#[1] 0.01409531373939070138246
想象一下你有长向量的情况 a,b,c
:
a -b -c == a + (-b -c)
差异可能具有统计显着性。
我可以提高内部逼近的级别以便在 return TRUE
以上进行测试吗?
如果我必须选择,哪个结果是最佳近似值:
a -b -c
还是 a + (-b -c)
?
回答第一个问题(可以提高浮点精度吗?):gmp
包提供了对任意精度运算的支持。
install.packages("gmp", dependencies=TRUE) # didn't see any dependencies
library(gmp)
z <- as.bigq(- 0.000904686260609299) # make smallest value a big-rational
0.02 +z -0.005 == 0.02 +(z -0.005)
#[1] TRUE
还有一个列出系统要求的 R 包 Rmpfr
:
SystemRequirements: gmp (>= 4.2.3), mpfr (>= 3.0.0)
我在 Ubuntu 中安装了 mpfr 使用:
$ sudo apt-get install libmpfr-dev libmpfr-doc libmpfr4 libmpfr4-dbg
我似乎不需要 gmp 的系统安装,但回头看控制台记录,我发现它是在 gmp 安装期间完成的,但我没有注意到。
我的脚本中有一个明显的错误。 几个小时后,我发现这是一个小数近似的问题。
要使问题可重现,请考虑以下事项:
0.02 - 0.000904686260609299 - 0.005 ==
0.02 + (-0.000904686260609299 - 0.005)
#[1] FALSE
其中:
print(0.02 -0.000904686260609299 -0.005, 22)
print(0.02 + (-0.000904686260609299 -0.005), 22)
#[1] 0.01409531373939069964774
#[1] 0.01409531373939070138246
想象一下你有长向量的情况 a,b,c
:
a -b -c == a + (-b -c)
差异可能具有统计显着性。
我可以提高内部逼近的级别以便在 return TRUE
以上进行测试吗?
如果我必须选择,哪个结果是最佳近似值:
a -b -c
还是 a + (-b -c)
?
回答第一个问题(可以提高浮点精度吗?):gmp
包提供了对任意精度运算的支持。
install.packages("gmp", dependencies=TRUE) # didn't see any dependencies
library(gmp)
z <- as.bigq(- 0.000904686260609299) # make smallest value a big-rational
0.02 +z -0.005 == 0.02 +(z -0.005)
#[1] TRUE
还有一个列出系统要求的 R 包 Rmpfr
:
SystemRequirements: gmp (>= 4.2.3), mpfr (>= 3.0.0)
我在 Ubuntu 中安装了 mpfr 使用:
$ sudo apt-get install libmpfr-dev libmpfr-doc libmpfr4 libmpfr4-dbg
我似乎不需要 gmp 的系统安装,但回头看控制台记录,我发现它是在 gmp 安装期间完成的,但我没有注意到。