Les posteurs les plus actifs de la semaine
Eric Wajnberg
Un problème très simple et vraiment très étrange Vote_lcapUn problème très simple et vraiment très étrange Voting_barUn problème très simple et vraiment très étrange Vote_rcap 


Un problème très simple et vraiment très étrange

Aller en bas

Un problème très simple et vraiment très étrange Empty Un problème très simple et vraiment très étrange

Message par skaperla le Mar 20 Nov 2012 - 14:03

Bonjour à tou·te·s, j'ai un curieux problème avec R :
J'ai besoin de vérifier des conditions, et j'utilise des booléens avec "==" mais j'ai le même problème en utilisant la fonction identical(), je ne comprends absolument pas la raison et je ne sais plus quoi faire Crying or Very sad Je vous copie-colle un code qui illustre mon problème :


Code:
> vect=seq(-0.45,0.45,0.1)
> vect
 [1] -0.45 -0.35 -0.25 -0.15 -0.05  0.05  0.15  0.25  0.35  0.45
> -0.45==vect[1]
[1] TRUE
> -0.35==vect[2]
[1] TRUE
> -0.25==vect[3]
[1] TRUE
> -0.15==vect[4]
[1] FALSE
> -0.05==vect[5]
[1] FALSE
> 0.05==vect[6]
[1] FALSE
> 0.15==vect[7]
[1] FALSE
> 0.25==vect[8]
[1] FALSE
> 0.35==vect[9]
[1] FALSE
> 0.45==vect[10]
[1] TRUE

Tout ça n'a aucun sens non ? Shocked Je ne comprends pas, R devrait me renvoyer TRUE à chaque fois ! Est ce que c'est déjà arrivé à quelqu'un ?
Merci d'avance
skaperla
skaperla

Nombre de messages : 18
Localisation : Tours
Date d'inscription : 11/05/2011

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Un problème très simple et vraiment très étrange Empty Re: Un problème très simple et vraiment très étrange

Message par droopy le Mar 20 Nov 2012 - 14:41

Ca peut paraitre n'avoir aucun sens mais c'est très fréquent avec des nombres. Pour tester une égalité avec des nombres il vaut mieux faire identical(all.equal(vect[4], -0.15), TRUE). Ca vient du stockage des nombres, en effet -0.45 n'est pas exactement egal à -0.45 :
Code:
options(digits=22)
> vect
 [1] -0.45000000000000001110223 -0.34999999999999997779554 -0.25000000000000000000000
 [4] -0.14999999999999996669331 -0.04999999999999998889777  0.04999999999999998889777
 [7]  0.15000000000000007771561  0.25000000000000005551115  0.35000000000000003330669
C'est une question de virgule flottante. Par conséquent selon le seuil qui est pris pour considérer que 2 nombre sont égaux alors une fois tu vas dire qu'ils le sont et une fois non (voir ton exemple).

Cordialement,
droopy
droopy
droopy

Nombre de messages : 1126
Date d'inscription : 04/09/2009

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Un problème très simple et vraiment très étrange Empty Re: Un problème très simple et vraiment très étrange

Message par skaperla le Mar 20 Nov 2012 - 15:25

droopy a écrit:Ca peut paraitre n'avoir aucun sens mais c'est très fréquent avec des nombres. Pour tester une égalité avec des nombres il vaut mieux faire identical(all.equal(vect[4], -0.15), TRUE). Ca vient du stockage des nombres, en effet -0.45 n'est pas exactement egal à -0.45 :
Code:
options(digits=22)
> vect
 [1] -0.45000000000000001110223 -0.34999999999999997779554 -0.25000000000000000000000
 [4] -0.14999999999999996669331 -0.04999999999999998889777  0.04999999999999998889777
 [7]  0.15000000000000007771561  0.25000000000000005551115  0.35000000000000003330669
C'est une question de virgule flottante. Par conséquent selon le seuil qui est pris pour considérer que 2 nombre sont égaux alors une fois tu vas dire qu'ils le sont et une fois non (voir ton exemple).

Cordialement,
droopy

Ah merci !
Par contre comme j'ai besoin de comparer tout un vecteur à une valeur je ne peux pas utiliser all.equal, mais en définissant vect avec c() plutôt que seq() je n'ai plus de problèmes.
skaperla
skaperla

Nombre de messages : 18
Localisation : Tours
Date d'inscription : 11/05/2011

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Un problème très simple et vraiment très étrange Empty Re: Un problème très simple et vraiment très étrange

Message par droopy le Mar 20 Nov 2012 - 15:55

après l'autre solution c'est de fixer toit même le seuil a partir duquel tu considères que des nombres sont égaux, parce que tu risques de toute manière d'être confronté à ce genre de problèmes. Pour plus de sureté moi je ferais un truc du genre :
Code:
abs(vect-nombre)<1e-10
avec nombre les valeurs que tu veux confronter a ton vecteur. Comme ça si la différence absolue entre les deux valeurs est inférieure à 10^-10 alors il considère que les deux valeurs sont égales.
droopy
droopy

Nombre de messages : 1126
Date d'inscription : 04/09/2009

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Un problème très simple et vraiment très étrange Empty Re: Un problème très simple et vraiment très étrange

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum