R不进行1e + 20位操作

时间:2013-10-11 17:40:23

标签: r

我想了解更多有关R中的精度计算会在E.g之间进行区分的信息。

-1128347132904321674821 < -1128347132904321674822
-1128347132904321674821 > -1128347132904321674822
-1128347132904321674821 == -1128347132904321674822

但前两个答案为FALSE,第三个答案为TRUE

我只想知道如何在点数中包含所有数字

2 个答案:

答案 0 :(得分:4)

当您键入一个大于最大整数大小的整数(您可以通过键入.Machine$integer.max找到),然后R将其强制转换为double。此外,只有(略小于)2 ^ 64个唯一的双值。 2 ^ 64约为1.84 * 10 ^ 19,而您输入的数字大约为10 ^ 21。但是,double的所有64位都不是精度位。其中一个是符号位,其中11个是尾数(即指数位)。因此,您只能获得52位精度,转换为大约15或16个十进制空格。您可以在R:

中测试
> for(i in 10:20)
    cat(i,10^i == 10^i+1,"\n")
10 FALSE 
11 FALSE 
12 FALSE 
13 FALSE 
14 FALSE 
15 FALSE 
16 TRUE 
17 TRUE 
18 TRUE 
19 TRUE 
20 TRUE 

所以你看,在大约15位数之后,双打所提供的精确度已经耗尽。可以在R中执行更高精度的算术,但是您需要加载提供此功能的库。其中一个库是gmp

> library(gmp)
> x<-as.bigz("-1128347132904321674821")
> y<-as.bigz("-1128347132904321674822")
> x<y
[1] FALSE
> x>y
[1] TRUE
> x==y
[1] FALSE
> x==y+1
[1] TRUE

答案 1 :(得分:3)

如果您需要大量数字的准确性,请使用gmpRmpfr(或两者:-))。

但请确保这是您的需求,而不是一般的浮点计算精度限制。