Подтвердить что ты не робот

Борьба с целыми числами (максимальный целочисленный размер)

Я использовал функцию, которая требует ввода как целые числа.

Итак, я пытался читать о создании целых чисел:

y <- 3.14
as.integer(y)
[1] 3              # all cool

Все хорошо, но если у меня

 x <- 1639195531833
 as.integer(x)
 [1] NA
 Warning message:
 NAs introduced by coercion 

У меня было options(digits = 15), и это смутило меня, почему оно не работает, но на чистой сессии должно быть связано с научной нотацией.

Я также попытался обмануть R, но он не был доволен:

  as.integer(as.character(x))
[1] 2147483647
Warning message:
inaccurate integer conversion in coercion 

Как я могу победить научную нотацию и получить целые числа?

4b9b3361

Ответ 1

Максимальное целое число R может иметь значение

.Machine$integer.max
# [1] 2147483647

Это не имеет ничего общего с научной нотацией и все, что связано с тем, как на самом деле компьютер хранит числа. Текущая версия R хранит целые числа по-прежнему как 32 бит, независимо от архитектуры. В будущем это может измениться.

см. также ?as.integer

В настоящее время вы можете получить доступ к 64-битным целым числам через пакет int64

> as.integer(.Machine$integer.max)
[1] 2147483647
> # We get problems with this
> as.integer(.Machine$integer.max + 1)
[1] NA
Warning message:
NAs introduced by coercion 
> # But if we use int64
> library(int64)
> as.int64(.Machine$integer.max) + 1L
[1] 2147483648

Ответ 2

Обновить до ответа Dason (не хватает репутации, чтобы сделать комментарий):

Пакет int64 теперь устарел, однако теперь есть пакет с именем bit64. Я смог добиться того же результата, используя его. Синтаксис слегка изменился с "as.int64" на "as.integer64".

т.е.

library(bit64)
as.integer64(.Machine$integer.max) + 1L

Ответ 3

кажется, что int64 уже устарел. Я использую пакет бит64, метод as.integer64() и решу проблему. подробности относятся к здесь.

Ответ 4

Существуют классы, которые могут обрабатывать большие целые числа. Я использую int64, его виньетка здесь:

http://cran.r-project.org/web/packages/int64/vignettes/int64.pdf

Чтобы использовать это, вы просто поместите некоторое нормальное число в этот класс, тогда вы можете добавить или умножить его на порог того, что нормальное 32-битное целое число. Удачи.