#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
inmat2
? Я не понимаю, почему оба вычисления не будут-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