在R[Inf]和Python中处理大数

2024-10-03 23:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我在学习Python,这可能是我关于Python的第一篇文章。我对R也比较陌生,已经使用R一年了。我在学习Python时比较了这两种语言。如果这个问题太简单了,我很抱歉。在

我不确定为什么R输出Inf而python却没有。在

在R:

nchar(2^1500)
[1] 3
2^1500
[1] Inf

在Python中:

^{pr2}$

我有两个问题:

a)为什么R提供Inf而Python没有呢

b)我研究了How to work with large numbers in 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

Tags: toin语言aswith文章howwork
2条回答

显然,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()函数:

^{pr2}$

因此,如果您的问题是具体的数字计数,那么this answer中讨论的gmp包可能是正确的方法。另一方面,如果您对任意精度的浮点运算感兴趣,Rmpfr可能是更好的选择。在

回答您的问题:

a)他们使用不同的数字表示法。R中的大多数数字表示为双精度浮点值。这些都是64位长,在整个范围内提供大约15位精度,从-双.xmax到双.xmax,然后切换到有符号无限值。R有时也使用32位整数值。这些数据覆盖了大约+/-20亿的范围。R选择这些类型是因为它面向统计和数值方法,而这些方法很少需要比双精度给出的精度更高的精度。(他们通常需要更大的范围,但通常使用日志可以解决这个问题。)

Python更像是一个通用平台,MichaelChirico的评论中讨论了它的类型。在

b)除了Brobdingnaggmp包还可以处理任意大的整数。例如

> as.bigz(2)^1500
Big Integer ('bigz') :
[1] 35074662110434038747627587960280857993524015880330828824075798024790963850563322203657080886584969261653150406795437517399294548941469959754171038918004700847889956485329097264486802711583462946536682184340138629451355458264946342525383619389314960644665052551751442335509249173361130355796109709885580674313954210217657847432626760733004753275317192133674703563372783297041993227052663333668509952000175053355529058880434182538386715523683713208549376
> nchar(as.character(as.bigz(2)^1500))
[1] 452

我想as.character()调用也需要Brobdingnag。在

相关问题 更多 >