Что такое переполнение целых чисел в R и как это может произойти? - PullRequest
32 голосов
/ 10 января 2012

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

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

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

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

РЕДАКТИРОВАТЬ: Я запускаю:

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

Ответы [ 3 ]

39 голосов
/ 10 января 2012

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

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

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

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

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

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

Обновление:

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

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

21 голосов
/ 10 января 2012

Короче говоря, 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(.)) должен помочь.

4 голосов
/ 10 января 2012

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

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

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

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...