Almacenar exactamente enteros grandes
algorithm precision (1)
En software R
a <- 123456789123456789123456789
sprintf("%27f",a)
#[1] "123456789123456791337762816.000000"
Recibí la respuesta incorrecta.
Quiero
a
valor exacto.
¿Por qué el sistema muestra el valor incorrecto de
a
?
La razón por la que no obtienes el valor exacto de
a
es porque R lo almacena como un doble en lugar de como un entero.
Debido a que
a
es muy grande, se produce un redondeo cuando se asigna
a
.
Normalmente, para almacenar cosas como números enteros, usaría
L
al final de los números;
algo como:
a <- 12L
class(a)
# [1] "integer"
Sin embargo, su número es demasiado grande para un entero estándar en R, y se ve obligado a usar la representación doble:
a <- 123456789123456789123456789L
# Warning message:
# non-integer value 123456789123456789123456789L qualified with L; using numeric value
class(a)
# [1] "numeric"
Necesitará precisión múltiple para almacenar exactamente un número entero de este tamaño.
Una opción sería el paquete
gmp
:
library(gmp)
a<-as.bigz("123456789123456789123456789")
a
# Big Integer (''bigz'') :
# [1] 123456789123456789123456789
Otras opciones para la aritmética de precisión múltiple están disponibles en el subtítulo "Matemática simbólica y aritmética de precisión múltiple" de la vista de tareas de matemática numérica CRAN .