Les posteurs les plus actifs de la semaine
Aucun utilisateur |
Sujets les plus vus
Un problème très simple et vraiment très étrange
2 participants
Page 1 sur 1
Un problème très simple et vraiment très étrange
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 Je vous copie-colle un code qui illustre mon problème :
Tout ça n'a aucun sens non ? Je ne comprends pas, R devrait me renvoyer TRUE à chaque fois ! Est ce que c'est déjà arrivé à quelqu'un ?
Merci d'avance
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 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 ? 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- Nombre de messages : 18
Localisation : Tours
Date d'inscription : 11/05/2011
Re: Un problème très simple et vraiment très étrange
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 :
Cordialement,
droopy
- 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
Cordialement,
droopy
droopy- Nombre de messages : 1156
Date d'inscription : 04/09/2009
Re: Un problème très simple et vraiment très étrange
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 :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).
- 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
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- Nombre de messages : 18
Localisation : Tours
Date d'inscription : 11/05/2011
Re: Un problème très simple et vraiment très étrange
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
droopy- Nombre de messages : 1156
Date d'inscription : 04/09/2009
Sujets similaires
» Trés trés urgent (((analyse de la variance )))
» très très urgent svp
» TRES TRES URGENT
» Que représente vraiment l'homoscédasticité ?
» Vraiment besoin d'aide!
» très très urgent svp
» TRES TRES URGENT
» Que représente vraiment l'homoscédasticité ?
» Vraiment besoin d'aide!
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum