gpt4 book ai didi

r - 管理浮点精度

转载 作者:行者123 更新时间:2023-12-01 13:33:25 25 4
gpt4 key购买 nike

我正在努力解决问题。浮点精度,找不到解决方案。

这是一个简短的例子:

aa<-c(99.93029, 0.0697122)
aa
[1] 99.9302900 0.0697122
aa[1]
99.93029
print(aa[1],digits=20)
99.930289999999999

看起来,在存储向量后,R 将数字转换为内部表示略有不同的东西(是的,我读过“R inferno”的圆圈 1 和类似 Material )。

我如何强制 R 不加修改地“按原样”存储输入值?

在我的例子中,我的问题是值的处理方式使得小错误很快增长:

aa[2]/(100-aa[1])*100
[1] 100.0032 ## Should be 100, of course !
print(aa[2]/(100-aa[1])*100,digits=20)
[1] 100.00315593171625

所以我需要找到一种方法使我的规范化正确。

谢谢

PS- 本网站和其他地方有很多问题,讨论明显的精度损失问题,即数字显示不正确(但存储正确)。在这里,例如: How to stop read.table from rounding numbers with different degrees of precision in R?这是一个明显的问题,因为数字存储不正确(但显示正确)。

(R 版本 3.2.1(2015-06-18),win 7 x64)

最佳答案

浮点精度总是会引起很多混淆。要记住的关键思想是:当你使用 double 时,没有办法“按原样”或“完全正确”地存储每个实数——你能存储的最好的是最接近的可用近似值。因此,当您键入(用 R 或任何其他现代语言)类似 x = 99.93029 的内容时,您将获得由 99.930289999999999 表示的数字。

现在,当您期望 a + b 为“恰好 100”时,您的用语就不准确了。你能得到的最好是“小数点后最多N位100”,希望N足够大。在您的情况下,说 99.9302900 + 0.0697122 是 100 是正确的,精确到小数点后 5 位。自然地,通过将​​该等式乘以 10^k,您将失去额外的 k 位精度。

所以,这里有两种解决方案:

一个。要获得更高的输出精度,请提供更高的输入精度。

bb <- c(99.93029, 0.06971) 
print(bb[2]/(100-bb[1])*100, digits = 20)
[1] 99.999999999999119

如果 double 不够(可能发生在复杂的算法中),请使用提供额外数字精度操作的包。例如,打包 gmp

关于r - 管理浮点精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44693506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com