Сильное поведение с большими числами в R [дубликат]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

4
задан josliber 3 September 2015 в 07:05
поделиться

1 ответ

Причина, по которой вы не получаете точное значение 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 для численной математики вид .

8
ответ дан josliber 18 August 2018 в 21:16
поделиться
  • 1
    a & lt; -as.bigz («2 * 3 * 7 * 43 * 1807 * 3263443»). Если я напечатаю так, Big Integer ('bigz'): [1] NA это так выглядит, так что я делаю? – aarthi 3 September 2015 в 06:57
  • 2
    @aarthi вы должны хранить каждый как bigz, а затем умножать; что-то вроде prod(as.bigz(c(2, 3, 7, 43, 1807, 3263443))) – josliber♦ 3 September 2015 в 06:58
  • 3
    @josilber Большое спасибо .... – aarthi 3 September 2015 в 07:02
  • 4
    factorize (113423713055421844361000443) и factorize (113423713055421845118910464) имеют тот же ответ, что я делаю? – aarthi 3 September 2015 в 08:29
  • 5
    @aarthi, пожалуйста, не используйте раздел комментариев этого ответа, чтобы задать совершенно новые вопросы; вместо этого вы должны использовать & quot; Ask Question & quot; чтобы все в сообществе видели ваш новый вопрос. Если этот ответ решает ваш первоначальный вопрос, вы можете подумать о его принятии, нажав зеленую галочку - это поможет будущим посетителям узнать, что она решила вашу проблему, и это даст вам немного репутации на этом сайте. – josliber♦ 3 September 2015 в 13:58
Другие вопросы по тегам:

Похожие вопросы: