140
Le logiciel R - Maˆ ıtriser le langage
dans les chiffres apr` es la virgule. Mais c’est aussi vrai pour des nombres qui
pourraient paraˆ ıtre plus simples, comme 0.1 ou 0.9 par exemple.
Ceci est illustr´ e par la sortie ci-dessous, pour le nombre 0.9, qui peut s’´ ecrire
en virgule flottante sous la forme 0.9 = (−1)
0
× 2
−1
× (1 + f ) avec f = 0.8. Mais,
puisque f n’est cod´ e « que » sur 52 bits (voir (3.2)), l’ordinateur n’en conservera
qu’une approximation. La fonction d’affichage formatC() permet de se faire une
id´ ee de la valeur utilis´ ee par R.
> dec2bin(0.8,52)
[1] "0.1100110011001100110011001100110011001100110011001101"
> f <- 2^(-1)+2^(-2)+2^(-5)+2^(-6)+2^(-9)+2^(-10)+2^(-13)+
+ 2^(-14)+2^(-17)+2^(-18)+2^(-21)+2^(-22)+2^(-25)+2^(-26)+
+ 2^(-29)+2^(-30)+2^(-33)+2^(-34)+2^(-37)+2^(-38)+2^(-41)+
+ 2^(-42)+2^(-45)+2^(-46)+2^(-49)+2^(-50)+2^(-52)
> f # Attention, l’affichage est en fait ici tronqué.
[1] 0.8
> formatC(f,50) # Partie fractionnaire de la mantisse la plus
# proche de 0.8 que l’ordinateur est capable
# d’obtenir sur 52 bits.
[1] "0.80000000000000004440892098500626161694526672363281"
> formatC(0.8,50)
[1] "0.80000000000000004440892098500626161694526672363281"
Nous pouvons maintenant afficher la valeur conserv´ ee et utilis´ ee par l’ordinateur en lieu et place de la valeur 0.9 :
> formatC(0.9,50)
[1] "0.90000000000000002220446049250313080847263336181641"
> formatC((-1)^0 * 2^(-1) * (1+f),50)
[1] "0.90000000000000002220446049250313080847263336181641"
> formatC((-1)^0 * 2^(-1) * (1+0.8),50)
[1] "0.90000000000000002220446049250313080847263336181641"
3.9.2.3 ´
Eviter certaines chausse-trappes num´ eriques
Commen¸ cons par apporter un ´ eclairage sur une bizarrerie num´ erique.
> identical(1.0-0.9,0.1)
[1] FALSE
> (1.0-0.9) == 0.1
[1] FALSE
Il nous est maintenant possible de comprendre cette sortie. En effet, les
nombres 1.0 − 0.9 et 0.1 son repr´ esent´ es de mani` ere diff´ erente, car bien que 1.0
soit parfaitement repr´ esent´ e, 0.1 et 0.9 ne le sont pas
> formatC(1.0,50)
[1] "
1"
Précédent

- 174/701

Suivant