R 使用带有gmp和机器限制的大整数
我想知道是否可以在R中使用大于R 使用带有gmp和机器限制的大整数,r,memory,gmp,bigint,mpfr,R,Memory,Gmp,Bigint,Mpfr,我想知道是否可以在R中使用大于.Machine$double.xmax(~1.79e308)值的整数。我认为通过在R中使用例如Rmpfr或gmp库,您可以分配任何大小的值,直到系统上的RAM限制?我认为这比.Machine$double.xmax更大,但显然不是 > require( gmp ) > as.bigz( .Machine$double.xmax ) Big Integer ('bigz') : [1] 1797693134862315708145274237317043
.Machine$double.xmax
(~1.79e308
)值的整数。我认为通过在R中使用例如Rmpfr
或gmp
库,您可以分配任何大小的值,直到系统上的RAM限制?我认为这比.Machine$double.xmax更大,但显然不是
> require( gmp )
> as.bigz( .Machine$double.xmax )
Big Integer ('bigz') :
[1] 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
> as.bigz( 1e309 )
Big Integer ('bigz') :
[1] NA
>
有人能解释为什么使用64位内存寻址的计算机不能存储大于1.79e308的值吗?对不起,我没有计算机科学背景,但我正在努力学习
谢谢。Rmpfr可以使用
您可能会发现阅读文档很有帮助,尤其是?as.bigz
的注释部分。谢谢joran。我错过了最后一行。令人烦恼的是,我现在不能使用科学记数法!是的,但是您可以像.bigz(10)^309那样执行。事实上,您可以这样做:%e%“PS我的聪明的hack只适用于整数x
,所以如果您想要1.5e309,您需要类似15%e%308
…注意,at的bcr包也不直接支持科学符号,但可以处理:e
val <- mpfr("1e309")
## 1 'mpfr' number of precision 17 bits
## [1] 9.999997e308
# set a precision (assume base 10)...
est_prec <- function(e) floor( e/log10(2) ) + 1
val <- mpfr("1e309", est_prec(309) )
## 1 'mpfr' number of precision 1027 bits
## [1]1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
.mpfr2bigz(val)
## Big Integer ('bigz') :
## [1] 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
# extract exponent from a scientific notation string
get_exp <- function( sci ) as.numeric( gsub("^.*e",'', sci) )
# Put it together
sci2bigz <- function( str ) {
.mpfr2bigz( mpfr( str, est_prec( get_exp( str ) ) ) )
}
val <- sci2bigz( paste0( format( Const("pi", 1027) ), "e309") )
identical( val, .mpfr2bigz( Const("pi",1027)*mpfr(10,1027)^309 ) )
## [1] TRUE
## Big Integer ('bigz') :
## [1] 3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587004
# Maximum number of representations
# double.base ^ double.max.exp
base <- mpfr(2, 2048)
max.exp <- mpfr( 1024, 2048 )
# This is where the big part of the 1.79... comes from
base^max.exp
## 1 'mpfr' number of precision 2048 bits
## [1] 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
# Smallest definitive unit.
# Find the largest negative integer...
neg.ulp.digits <- -64; while( ( 1 - 2^neg.ulp.digits ) == 1 )
neg.ulp.digits <<- neg.ulp.digits + 1
neg.ulp.digits
## [1] -53
# It makes a real small number...
neg.eps <- base^neg.ulp.digits
neg.eps
## 1 'mpfr' number of precision 2048 bits
## [1] 1.11022302462515654042363166809082031250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-16
# Largest difinitive floating point number less than 1
# times the number of representations
xmax <- (1-neg.eps) * base^max.exp
xmax
## 1 'mpfr' number of precision 2048 bits
## [1] 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
identical( asNumeric(xmax), .Machine$double.xmax )
## [1] TRUE