Tratar con grandes números en R y Python

Estoy aprendiendo Python en estos días, y esta es probablemente mi primera publicación en Python. También soy relativamente nuevo en R, y he estado usando R durante aproximadamente un año. Estoy comparando ambos idiomas mientras aprendo Python. Pido disculpas si esta pregunta es demasiado básica.

No estoy seguro de por qué R produce Inf para algo que python no. Tomemos 2^1500 como ejemplo.

En R:

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

En Python:

 len(str(2**1500)) Out[7]: 452 2**1500 Out[8]: 3507466211043403874... 

Tengo dos preguntas:

a) ¿Por qué R proporciona Inf cuando Python no lo hace?

b) He investigado ¿Cómo trabajar con grandes números en R? hilo. Parece que Brobdingnag podría ayudarnos a lidiar con grandes números. Sin embargo, incluso en tal caso, no puedo calcular nchar . ¿Cómo calculo la expresión anterior, es decir, 2 ^ 1500 en 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 

En respuesta a tus preguntas:

a) Usan diferentes representaciones para los números. La mayoría de los números en R se representan como valores de punto flotante de doble precisión. Estos tienen una longitud de 64 bits y dan una precisión de aproximadamente 15 dígitos en todo el rango, que va desde -double.xmax a double.xmax, y luego cambia a valores infinitos firmados. R también usa valores enteros de 32 bits a veces. Estos cubren el rango de aproximadamente +/- 2 mil millones. R elige estos tipos porque está orientado hacia métodos estadísticos y numéricos, y estos rara vez necesitan más precisión que la doble precisión. (A menudo necesitan un rango más amplio, pero generalmente, al tomar registros se resuelve ese problema).

Python es más una plataforma de propósito general, y tiene los tipos analizados en el comentario de MichaelChirico.

b) Además de Brobdingnag , el paquete gmp puede manejar enteros arbitrariamente grandes. Por ejemplo,

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

Me imagino que la llamada as.character() también sería necesaria con Brobdingnag .

Al parecer, Python usa enteros de precisión arbitrarios por defecto cuando es necesario. R no lo hace. Sin embargo, hay muchos paquetes R útiles para realizar aritmética de precisión arbitraria. El paquete a elegir depende del caso de uso.

Para abrir un paquete que aún no se ha discutido, considere el paquete Rmpfr :

 > library(Rmpfr) > a <- 2^mpfr(1500, 10000) > a 1 'mpfr' number of precision 10000 bits [1] 35074662110434038747627587960280857993524015880330828824075798024790963850563322203657080886584969261653150406795437517399294548941469959754171038918004700847889956485329097264486802711583462946536682184340138629451355458264946342525383619389314960644665052551751442335509249173361130355796109709885580674313954210217657847432626760733004753275317192133674703563372783297041993227052663333668509952000175053355529058880434182538386715523683713208549376 

Requiere que establezca una precisión, pero si la hace lo suficientemente grande, puede contener 2 ^ 1500 como entero.

Sin embargo, tampoco parece definir una función as.character() :

 > as.character(a) [1] "" 

Entonces, si su problema es específicamente contar los dígitos, entonces el paquete gmp como se explica en esta respuesta es probablemente el camino a seguir. Por otro lado, si está interesado en aritmética de punto flotante de precisión arbitraria, Rmpfr podría ser una mejor opción.