Точное хранение больших целых чисел

В программном обеспечении R

a <- 123456789123456789123456789 sprintf("%27f",a) #[1] "123456789123456791337762816.000000" 

Я получил неправильный ответ. Я хочу получить точные значения.

Почему система показывает неправильное значение a ?

Причина, по которой вы не получаете точное значение a заключается в том, что R хранит его как double, а не как целое число. Поскольку a очень большой, существует некоторое округление, которое имеет место, когда вы назначаете a .

Обычно для хранения вещей в виде целых чисел вы должны использовать L в конце чисел; что-то вроде:

 a <- 12L class(a) # [1] "integer" 

Однако ваш номер слишком велик для стандартного целого числа в R, и вы вынуждены использовать двойное представление:

 a <- 123456789123456789123456789L # Warning message: # non-integer value 123456789123456789123456789L qualified with L; using numeric value class(a) # [1] "numeric" 

Вам понадобится многократная точность, чтобы точно сохранить целое число. Одним из вариантов был бы пакет gmp :

 library(gmp) a<-as.bigz("123456789123456789123456789") a # Big Integer ('bigz') : # [1] 123456789123456789123456789 

Другие варианты арифметики с несколькими точками доступны в подзаголовке подзаголовки «Многоточечная арифметика и символьная математика» в представлении задач численной математики CRAN .

Давайте будем гением компьютера.