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

Что такое целочисленное переполнение в R и как это может произойти?

У меня есть некоторые вычисления, и вы получите следующее предупреждение (т.е. не ошибка):

Warning messages:
1: In sum(myvar, na.rm = T) :
Integer overflow - use sum(as.numeric(.))

В этом потоке люди утверждают, что целых переполнений просто не бывает. Либо R не слишком современен, либо они не правы. Однако, что я должен здесь делать? Если я использую as.numeric, как предупреждает, я могу не учитывать тот факт, что информация была потеряна раньше. myvar считывается форма CSV файла, поэтому R не должен указывать, что требуется большее поле? Это уже что-то отрезало?

Какова максимальная длина integer или numeric? Вы предложили бы любой другой тип/режим поля?

EDIT: я запускаю:

R версия 2.13.2 (2011-09-30) Платформа: x86_64-apple-darwin9.8.0/x86_64 (64-разрядная версия) в R Studio

4b9b3361

Ответ 1

Вы можете ответить на многие ваши вопросы, прочитав справочную страницу ?integer. В нем говорится:

R использует 32-разрядные целые числа для целых векторов, поэтому диапазон представляемые целые числа ограничены примерно +/- 2 * 10 ^ 9.

Расширение до больших целых чисел рассматривается R Core, но это не произойдет в ближайшем будущем.

Если вы хотите установить емкость "bignum", установите Martin Maechler Пакет Rmpfr [PDF]. Я рекомендую пакет "Rmpfr" из-за репутации автора. Martin Maechler также активно участвует в разработке пакета Matrix, а также в R Core. Существуют альтернативы, включая арифметические пакеты, такие как "gmp", "Brobdingnag" и "Ryacas" (последний также предлагает символический математический интерфейс).

Затем, чтобы ответить на критические замечания в ответе, на который вы ссылались, и как оценить релевантность вашей работы, рассмотрите это: если бы были одни и те же статистические функции, доступные на одном из этих "современных" языков, поскольку существует в R, вероятно, вы увидите миграцию пользователя в этом направлении. Но я бы сказал, что миграция, и, конечно же, рост, сейчас находится в направлении R. R был создан статистиками для статистики.

В свое время был вариант Lisp со статистическим пакетом Xlisp-Stat, но его главный разработчик и сторонник теперь является членом R-Core. С другой стороны, один из ранних разработчиков R, Росс Ихака, предлагает работать над разработкой в ​​Lisp - как язык [PDF]. Существует скомпилированный язык под названием Clojure (произносится так, как говорят англичане "закрытие" ) с экспериментальным интерфейсом, Rincanter.

Update:

Новые версии R (3.0. +) имеют 53-битные целые числа (используя numeric мантисса). Когда "целочисленному" векторному элементу присваивается значение, превышающее ".Machine $integer.max", весь вектор привязывается к "numeric", a.k.a. "double". Максимальное значение для integers остается таким, каким оно было, однако может быть принуждение целочисленных векторов к удвоению, чтобы сохранить точность в случаях, которые раньше генерировали бы переполнение. К сожалению, длина списков, размеров матрицы и массива и векторов по-прежнему установлена ​​на уровне integer.max.

При чтении в больших значениях из файлов, вероятно, безопаснее использовать характер-класс в качестве цели, а затем манипулировать. Если есть принуждение к значениям NA, будет предупреждение.

Ответ 2

Короче говоря, integer - это точный тип с ограниченным диапазоном, а numeric - тип с плавающей запятой, который может представлять гораздо более широкий диапазон значений, но неточный. Подробнее см. на страницах справки (?integer и ?numeric).

Что касается переполнения, вот описание Брайана Д. Рипли:

Это означает, что вы принимаете среднее значение [в вашем случае, сумму - @aix] некоторых очень больших целых чисел и вычисление переполняется. Это просто предупреждение.

Это не произойдет в следующей версии R.

Вы можете указать, что число является целым числом, указав его суффикс L, например, 1L является целым, а не 1, который является плавающей точкой, с классом "numeric".

Наибольшее целое число, которое вы можете создать на вашем компьютере, задается .Machine$integer.max.

> .Machine$integer.max
[1] 2147483647
> class(.Machine$integer.max)
[1] "integer"

Добавление положительного целого к этому приводит к переполнению, возвращая NA.

> .Machine$integer.max + 1L
[1] NA
Warning message:
In .Machine$integer.max + 1L : NAs produced by integer overflow
> class(.Machine$integer.max + 1L)
[1] "integer"

Вы можете обойти это ограничение, добавив вместо этого значения с плавающей запятой.

> .Machine$integer.max + 1
[1] 2147483648
> class(.Machine$integer.max + 1)
[1] "numeric"

Так как в вашем случае предупреждение выдается sum, это означает, что переполнение происходит, когда числа добавляются вместе. Предлагаемое обходное решение sum(as.numeric(.)) должно выполнить трюк.

Ответ 3

Какова максимальная длина целого или числового?

Векторы в настоящее время индексируются с целым числом, поэтому максимальная длина задается .Machine$integer.max. Как отметил DWin, во всех версиях R в настоящее время используются 32-битные целые числа, поэтому это будет 2^31 - 1 или чуть более 2 миллиардов.

Если вы не упаковываете какое-то серьезное оборудование (или вы читаете это в будущем, привет от 2012 года), вам не хватит памяти для выделения векторов, которые долгое время.

Я помню дискуссию, в которой R-core (Брайан Рипли, я думаю) предположил, что следующим шагом может стать индексирование векторов с мантиссой удвоений или что-то умное, эффективно дающее 48-битный индекс. К сожалению, я не могу найти эту дискуссию.


В дополнение к пакету Rmpfr, если вы испытываете переполнение целых чисел, вы можете попробовать пакет int64.