r algorithm precision floating-point-precision

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 .