Как матрицы обрабатывают деление на 0?

#r #matrix

#r #матрица

Вопрос:

Я столкнулся с неожиданным (для меня) поведением с тем, как R (R-3.0.3) обрабатывает Inf внутри матрицы.

 scalar <- 1

mat1 <- matrix(0)
mat2 <- matrix(1)
mat2 <- -log(mat2)

# > mat1
#       [,1]
# [1,]    0
#
# > mat2
#       [,1]
# [1,]    0

(mat1[1,1] - scalar[1])/mat1[1,1]
# [1] -Inf

(mat2[1,1] - scalar[1])/mat2[1,1]
# [1] Inf
  

Почему оба не дают -Inf ? Я ничего не вижу в файле справки matrix . Я также не мог определить разницу между mat1 и mat2 использованием class , str или dput .

Комментарии:

1. У меня был момент сомнения, но да, ты просто делаешь (-1) / -log(1) . Почему этого не должно быть Inf ?

2. Значит, R хранит -log(1) вместо 0 in mat2 ? Я не понимаю, почему оба вычисления не будут -1/0 ?

3. Тонкости арифметики IEEE … сложны. Я просто говорю, что меня не удивляет, что это -log(1) может привести к нулю со знаком под капотом.

4. Я бы просто ожидал получить -Inf , когда я думаю, что я вычисляю -1/0 . Результат делает определение знака более трудоемким. Может быть, лучше задать вопрос о том, как matrix обрабатываются журналы?

5. Это не имеет никакого отношения к классу matrix. Это будет фундаментальным аспектом того, как R реализует (почти наверняка правильно) стандарты IEEE для выполнения арифметики. Единственное решение — работать в рамках этих стандартов.

Ответ №1:

Я просто подведу итог обсуждению комментариев, чтобы закрыть вопрос.

Во-первых, это поведение не характерно для матриц, обратите внимание

 a<- 0; (a-1)/a
# [1] -Inf

a<- -log(1); (a-1)/a
# [1] Inf
  

но скорее это результат сложностей арифметики с плавающей запятой IEEE. Несмотря на то, что

 -log(1) == 0
# [1] TRUE
  

ноль действительно может содержать знак. Существует » 0″ и «-0» и -log(1) возвращает последнее. Добавление 0 к отрицательному нулевому значению должно сделать его «обычным» нулем.

 a<- -log(1) 0; (a-1)/a
# [1] -Inf