2013-07-15 8 views
0

В R, почему это неверно для y> 2?Почему exp (log (6)) == exp (log (3)) * 2 return FALSE в R?

y <- c(1, 2, 3, 4, 5) 
x <- 2*y 
exp(log(x)) == exp(log(y)) * 2 
[1] TRUE TRUE FALSE FALSE FALSE 
+8

Ошибка округления с плавающей точкой. Вы заметите, что 'exp (log (y))' не точно '3'. Прочитайте [Что должен знать каждый компьютерный ученый о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). –

+0

Спасибо. В этом случае я знаю из теории, что результаты должны быть одинаковыми. Как сравнить результаты в случае, когда я не знаю, должны ли они быть равными? Невозможно? –

+0

Но 'exp (log (y))' возвращает '[1] 1 2 3 4 5' и' exp (log (x)) 'возвращает' [1] 2 4 6 8 10', что именно то, что вводит в заблуждение меня. –

ответ

4

Цифровая точность. Попробуйте вычисления разницы:

exp(log(x)) - exp(log(y)) * 2 

Вы могли бы использовать что-то вроде:

all.equal(exp(log(x)) , exp(log(y)) * 2) 
+0

Или что-то вроде 'apply (cbind (exp (log (x)), exp (log (y)) * 2), 1, function (tmp) all.equal (tmp [[1]], tmp [[2] ])) 'для проверки каждого элемента. – Roland

1

Ровно, то numerci точность является причиной. Попробуйте это, еще более простой расчет

1/2+1/3+1/6 #equal to 1  
(1/2+1/3+1/6)-1 # should be 0 
[1] -1.110223e-16 
+0

В первой строке отображается '1', но это не '' равно 1 ''. – nobar