R 管理浮点精度

R 管理浮点精度,r,precision,R,Precision,我正在努力解决这些问题。浮点精度,无法找到解决方案 下面是一个简短的例子: aa<-c(99.93029, 0.0697122) aa [1] 99.9302900 0.0697122 aa[1] 99.93029 print(aa[1],digits=20) 99.930289999999999 因此,我需要找到一种方法,使我的正常化正确 谢谢 PS-在本网站和其他地方有许多问题,讨论了明显的精度损失问题,即数字显示不正确(但存储正确)。例如,在这里: 这是一个明显的问题,因为号码存

我正在努力解决这些问题。浮点精度,无法找到解决方案

下面是一个简短的例子:

aa<-c(99.93029, 0.0697122)
aa
[1] 99.9302900  0.0697122
aa[1]
99.93029
print(aa[1],digits=20)
99.930289999999999
因此,我需要找到一种方法,使我的正常化正确

谢谢

PS-在本网站和其他地方有许多问题,讨论了明显的精度损失问题,即数字显示不正确(但存储正确)。例如,在这里: 这是一个明显的问题,因为号码存储不正确(但显示在右侧)


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

我想你误解了这里的意思。这与R存储正确值的情况相同,但显示时会根据所选选项的值相应地显示该值。 例如:

但是


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

现在,当你期望
a+b
精确到“100”时,你的术语是不准确的。你能得到的最好结果是“小数点后100到N位”,并且希望N足够大。在您的情况下,可以正确地说
99.9302900+0.0697122
是100,精度为5个小数点。当然,如果将该等式乘以10^k,您将失去额外的k位精度

因此,这里有两种解决方案:

a。要在输出中获得更高的精度,请在输入中提供更高的精度

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

bb除了前面的答案之外,我认为关于这个主题的一个好讲座应该是

R地狱,由p.伯恩斯创作


我相信你的问题不是关于阅读表格,而是关于R.hmmmYeees的数字精度。。。我明白你的意思了。最后一个例子和我的相似。但这意味着1存储为1,1.1存储为1.1+1e-16,不是吗?我认为这是不可预测的/不在用户的控制之下。我可能会得到一些“正确”的数字,一些“错误”。我可以理解,但是你会建议我如何解决这个问题(特别是,让
a2/(100-a1)=1
,或者确实足够接近1)?@jfmoyen,将
signif
函数用于解决取整
round(aa[2]/(100 aa[1]),digits=1的问题。。打印时不必包括数字选项。只需使用打印(a2/(100-a1)=1)
[1]100
@imh017,我意识到这一点,但问题是因为我的值“不够接近100”(正如您在另一个回复中简洁地解释的那样)在下游重复使用,并且错误很快累积起来。这不是显示结果的问题。@Parth,我想我最终会用round/signif来控制事情,事实上。对于澄清,用正确的术语来设置问题非常有帮助!然而,我不明白你使用bb的例子和我使用aa的例子之间的区别?在这种情况下,您是如何提供“更精确的输入”的?@jfmoyen
sum(aa)
是100.0000022,而
sum(bb)
是100到10^-15。另一种方式是,
cc我知道,我在最初的问题中提到了:-)遗憾的是,“地狱”并不意味着解决方案……oops:D不,事实上,通常没有(简单的)解决方案。但至少它表明这是一个已知的问题:)
# the output of below will be:
> print(99.930289999999999,digits=20)
[1] 99.930289999999999395
# the output of:
> print(1,digits=20)
[1] 1
> print(1.1,digits=20)
[1] 1.1000000000000000888
bb <- c(99.93029, 0.06971) 
print(bb[2]/(100-bb[1])*100, digits = 20)
[1] 99.999999999999119