这些天我正在学习Python,这可能是我在Python上的第一篇文章。我对R也相对较新,并且已经使用R大约一年了。我在学习Python时比较两种语言。如果这个问题太基础,我道歉。
我不确定为什么R输出Inf
为什么python没有。我们以2^1500
为例。
在R:
nchar(2^1500)
[1] 3
2^1500
[1] Inf
在Python中:
len(str(2**1500))
Out[7]: 452
2**1500
Out[8]: 3507466211043403874...
我有两个问题:
a)为什么当Python没有时,R提供Inf
。
b)我研究了How to work with large numbers in R?主题。似乎Brobdingnag
可以帮助我们处理大量数据。但是,即使在这种情况下,我也无法计算nchar
。 如何计算上面的表达式,即R
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
答案 0 :(得分:7)
回答你的问题:
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
我想as.character()
也需要Brobdingnag
来电。
答案 1 :(得分:5)
显然,python在需要时默认使用任意精度整数。 R没有。但是,有许多有用的R包来执行任意精度算术。选择哪个包取决于用例。
要打开一个尚未讨论的软件包,请考虑Rmpfr
软件包:
> library(Rmpfr)
> a <- 2^mpfr(1500, 10000)
> a
1 'mpfr' number of precision 10000 bits
[1] 35074662110434038747627587960280857993524015880330828824075798024790963850563322203657080886584969261653150406795437517399294548941469959754171038918004700847889956485329097264486802711583462946536682184340138629451355458264946342525383619389314960644665052551751442335509249173361130355796109709885580674313954210217657847432626760733004753275317192133674703563372783297041993227052663333668509952000175053355529058880434182538386715523683713208549376
它要求你设置一个精度,但如果你把它设得足够大,它可以保持2 ^ 1500为整数。
但是,它似乎也没有定义as.character()
函数:
> as.character(a)
[1] "<S4 object of class \"mpfr1\">"
因此,如果您的问题专门用于计算数字,那么this answer中讨论的gmp
包可能就是这样。另一方面,如果您对任意精度浮点算术感兴趣,Rmpfr
可能是更好的选择。