我想了解更多有关R中的精度计算会在E.g之间进行区分的信息。
-1128347132904321674821 < -1128347132904321674822
-1128347132904321674821 > -1128347132904321674822
-1128347132904321674821 == -1128347132904321674822
但前两个答案为FALSE
,第三个答案为TRUE
我只想知道如何在点数中包含所有数字
答案 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)
如果您需要大量数字的准确性,请使用gmp
或Rmpfr
(或两者:-))。
但请确保这是您的需求,而不是一般的浮点计算精度限制。