2010-11-02 7 views
5

Possible en double:
Numeric comparison difficulty in RPremier cercle de R enfer. 0,1 = 0,3/3

Bonjour à tous,

Selon "R Inferno" papier. Je suis maintenant dans le premier cercle de R enfer. C'est là que les païens s'attendent à 0,1 == 0,3/3. Le papier recommande d'utiliser la fonction all.equal pour de tels cas, cependant je dois vérifier les conditions "> =" ou "< =". Avec l'exemple actuel sur d'entre eux échouent:

> .1 >= .3/3 
[1] TRUE 
> .1 <= .3/3 
[1] FALSE 

Y at-il une fonction similaire à tous.qualité qui vérifie les inégalités?

Merci,

Ilya

+3

Ce n'est pas une erreur spécifique à R, mais une erreur commune provoquée par la représentation binaire des nombres à virgule flottante. Voir http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems par exemple. – schnaader

+0

Je sais pourquoi une erreur se produit. Je voudrais savoir s'il existe une fonction R capable de vérifier les inégalités ou si je dois en écrire une avec des points flottants en tête. – ilya

+0

oui, je dois faire de meilleures recherches – ilya

Répondre

7

Voir ces questions:

D'une manière générale, vous pouvez traiter en incluant un niveau de tolérance selon le second lien ci-dessus.

+0

Voir le deuxième lien qui répond directement à la question. – Shane

+0

Merci Shane, en deuxième lien, j'ai trouvé votre message avec la création d'un nouvel opérateur - exactement ce que je voulais. Je vous remercie!! – ilya

+0

@ilya Heureux nous pourrions aider! – Shane

4

S'il vous plaît voir le R FAQ entry Why doesn't R think these numbers are equal et les références qui s'y trouvent.

+1

C'est fascinant, mais pas une réponse à l'OP. – mob

+3

Sûr est, ou vous lisez une autre entrée 7.31. L'exemple 'sqrt (2) * sqrt (2) == 2' apparaît comme FALSE et est le même problème ici: représentation de nombres à virgule flottante. –

2

Vous pourriez essayer l'utilisation judicieuse de zapsmall() qui semble donner le comportement que vous recherchez. Je ne sais pas si cela fonctionne dans toutes les situations. par exemple,

.1 >= zapsmall(.3/3) 
[1] TRUE 
> .1 <= zapsmall(.3/3) 
[1] TRUE 
8

Le test principal de all.equal est de savoir si abs(x-y) < tolerance pour certaines valeurs x et y et une petite tolerance. Les tests d'inégalité équivalents vérifient:

x <= y:   x-y < tolerance 
x < y:   x-y < -tolerance 
x >= y:   x-y > -tolerance 
x > y:   x-y > tolerance