我这些天正在学习Python,这可能是我关于Python的第一篇文章.我对R也相对较新,并且已经使用R大约一年了.我在学习Python时比较两种语言.如果这个问题太基础,我道歉.
我不确定为什么py输出Inf的R输出没有.我们2^1500以此为例.
在R:
nchar(2^1500)
[1] 3
2^1500
[1] Inf
Run Code Online (Sandbox Code Playgroud)
在Python中:
len(str(2**1500))
Out[7]: 452
2**1500
Out[8]: 3507466211043403874...
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
a)Inf当Python没有时,为什么R提供.
b)我研究了如何在R中使用大数?线.这似乎Brobdingnag可以帮助我们解决大量问题.但是,即使在这种情况下,我也无法计算nchar.如何计算上面的表达式,即R中的2 ^ 1500
2^Brobdingnag::as.brob(500)
[1] +exp(346.57)
> nchar(2^Brobdingnag::as.brob(500))
Error in nchar(2^Brobdingnag::as.brob(500)) :
no method for coercing this S4 class to a vector
Run Code Online (Sandbox Code Playgroud)
在回答你的问题时:
a)他们对数字使用不同的表示.R中的大多数数字表示为双精度浮点值.这些都是64位长,并且在整个范围内提供大约15位精度,从-double.xmax到double.xmax,然后切换到有符号无限值.R有时也使用32位整数值.这些范围大约为+/- 20亿.R选择这些类型是因为它适用于统计和数值方法,而那些很少需要比双精度更精确的方法.(它们通常需要更大的范围,但通常采用日志解决了这个问题.)
Python更像是一个通用平台,它有MichaelChirico评论中讨论的类型.
b)此外Brobdingnag,gmp包可以处理任意大的整数.例如,
> as.bigz(2)^1500
Big Integer ('bigz') :
[1] 35074662110434038747627587960280857993524015880330828824075798024790963850563322203657080886584969261653150406795437517399294548941469959754171038918004700847889956485329097264486802711583462946536682184340138629451355458264946342525383619389314960644665052551751442335509249173361130355796109709885580674313954210217657847432626760733004753275317192133674703563372783297041993227052663333668509952000175053355529058880434182538386715523683713208549376
> nchar(as.character(as.bigz(2)^1500))
[1] 452
Run Code Online (Sandbox Code Playgroud)
我想这个as.character()电话也需要Brobdingnag.
显然,python在需要时默认使用任意精度整数.R没有.但是,有许多有用的R包来执行任意精度算术.选择哪个包取决于用例.
要提出尚未讨论的Rmpfr包,请考虑包:
> library(Rmpfr)
> a <- 2^mpfr(1500, 10000)
> a
1 'mpfr' number of precision 10000 bits
[1] 35074662110434038747627587960280857993524015880330828824075798024790963850563322203657080886584969261653150406795437517399294548941469959754171038918004700847889956485329097264486802711583462946536682184340138629451355458264946342525383619389314960644665052551751442335509249173361130355796109709885580674313954210217657847432626760733004753275317192133674703563372783297041993227052663333668509952000175053355529058880434182538386715523683713208549376
Run Code Online (Sandbox Code Playgroud)
它需要你设置一个精度,但如果你把它设得足够大它可以保持2 ^ 1500作为整数.
但是,它似乎也没有定义一个as.character()函数:
> as.character(a)
[1] "<S4 object of class \"mpfr1\">"
Run Code Online (Sandbox Code Playgroud)
因此,如果您的问题专门用于计算数字,那么本回答中gmp讨论的包可能是要走的路.另一方面,如果您对任意精度浮点运算感兴趣,可能是更好的选择.Rmpfr