nombres décimaux

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Christophe Chaussin
Messages : 6
Enregistré le : 25 Fév 2009, 09:17

nombres décimaux

Messagepar Christophe Chaussin » 14 Fév 2014, 19:36

Bonjour à tous,

Je viens de me rendre compte d'un petit détail qui me tue. Voici mon code :

Code : Tout sélectionner

> A <- seq(-1,1,0.1)
> print(A)
 [1] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1  0.0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.0
> print(as.character(A))
 [1] "-1"   "-0.9" "-0.8" "-0.7" "-0.6" "-0.5" "-0.4" "-0.3" "-0.2" "-0.1" "0"    "0.1"  "0.2"  "0.3"  "0.4"  "0.5"  "0.6"  "0.7"  "0.8"  "0.9"  "1"   


tout va bien, et puis :

Code : Tout sélectionner

> which(A %in% -0.1)
integer(0)


et puis :

Code : Tout sélectionner

> A <- seq(-3,3,0.1)
> print(A)
 [1] -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1  0.0  0.1  0.2  0.3
[35]  0.4  0.5  0.6  0.7  0.8  0.9  1.0  1.1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9  2.0  2.1  2.2  2.3  2.4  2.5  2.6  2.7  2.8  2.9  3.0
> print(as.character(A))
 [1] "-3"                  "-2.9"                "-2.8"                "-2.7"                "-2.6"                "-2.5"                "-2.4"               
 [8] "-2.3"                "-2.2"                "-2.1"                "-2"                  "-1.9"                "-1.8"                "-1.7"               
[15] "-1.6"                "-1.5"                "-1.4"                "-1.3"                "-1.2"                "-1.1"                "-1"                 
[22] "-0.9"                "-0.8"                "-0.7"                "-0.6"                "-0.5"                "-0.4"                "-0.3"               
[29] "-0.2"                "-0.0999999999999996" "0"                   "0.1"                 "0.2"                 "0.3"                 "0.4"               
[36] "0.5"                 "0.6"                 "0.7"                 "0.8"                 "0.9"                 "1"                   "1.1"               
[43] "1.2"                 "1.3"                 "1.4"                 "1.5"                 "1.6"                 "1.7"                 "1.8"               
[50] "1.9"                 "2"                   "2.1"                 "2.2"                 "2.3"                 "2.4"                 "2.5"               
[57] "2.6"                 "2.7"                 "2.8"                 "2.9"                 "3"                 


et enfin, bien sûr :

Code : Tout sélectionner

> which(A %in% -0.5)
[1] 26
> which(A %in% -0.1)
integer(0)


Si l'un d'entre vous peut éclairer ma lanterne, je lui en serai grandement reconnaissant.

Bon week-end à tous

P.S : j'ai la dernière version de R ou presque, la 3.02, et cela "fonctionne" sur mac et sur linux... pas tester sur windows.[/quote][/code]

Christophe Chaussin
Messages : 6
Enregistré le : 25 Fév 2009, 09:17

Messagepar Christophe Chaussin » 14 Fév 2014, 19:46

Bon, je vais répondre à ma question. J'ai trouvé un début d'explication ici :
http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy

et du coup :

Code : Tout sélectionner

> which(round(A, digits= 10) %in% round(-0.1, digits= 10))
[1] 30


s'il y plus simple, je suis preneur quand même ;)

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 15 Fév 2014, 08:57

Comme indiqué dans la réf que vous citez c'est une FAQ. Voir ?all.equal

Code : Tout sélectionner

> A <- seq(-1,1,0.1)
> A == .1
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE FALSE
> sapply(A, function(x) isTRUE(all.equal(x, .1)))
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE FALSE
Renaud

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 17 Fév 2014, 08:52

Bonjour,

ces questions de virgule stockage des valeurs numériques dans la mémoire et de virgule flottante sont récurrentes. Plutôt que de transformer le vecteur en caractère qui va gérer ces problèmes tu peux faire afficher plus de décimale a ton vecteur pour te rendre compte de ce qui se passe :

Code : Tout sélectionner

sprintf("%0.25f", A)
Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron