2013-07-15 2 views
0

En R, pourquoi est-ce faux pour y> 2?Pourquoi exp (log (6)) == exp (log (3)) * 2 renvoie FALSE dans 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

Erreur d'arrondi du point flottant. Vous remarquerez que 'exp (log (y))' n'est pas exactement '3'. Avoir une lecture de [Ce que tout scientifique informatique devrait savoir sur l'arithmétique à virgule flottante] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). –

+0

Merci. Dans ce cas, je sais par théorie que les résultats doivent être les mêmes. Comment puis-je comparer les résultats dans un cas où je ne sais pas s'ils devraient être égaux? Impossible? –

+0

Mais 'exp (log (y))' renvoie '[1] 1 2 3 4 5', et' exp (log (x)) 'renvoie' [1] 2 4 6 8 10' qui est exactement ce qui était source de confusion moi. –

Répondre

4

Précision numérique. Essayez de calculer la différence:

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

Vous pouvez utiliser quelque chose comme:

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

Ou quelque chose comme 'apply (cbind (exp (log (x)), exp (log (y)) * 2), 1, fonction (tmp) all.equal (tmp [[1]], tmp [[2] ])) 'pour vérifier chaque élément. – Roland

1

Exactement, la précision numerci est la cause. Essayez ceci, calcul encore plus simple

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

La première ligne affiche '1', mais elle n'est pas '' égale à 1 ''. – nobar