Chapitre 3. Manipulation de donn´ ees, fonctions
141
> formatC(0.9,50)
[1] "0.90000000000000002220446049250313080847263336181641"
> formatC(1.0-0.9,50)
[1] "0.099999999999999977795539507496869191527366638183594"
> formatC(0.1,50)
[1] "0.1000000000000000055511151231257827021181583404541"
et par cons´ equent, on a :
> formatC(1.0 -
+ 0.90000000000000002220446049250313080847263336181641,50)
[1] "0.099999999999999977795539507496869191527366638183594"
> # qui est bien différent de:
> formatC(0.1,50)
[1] "0.1000000000000000055511151231257827021181583404541"
Astuce
Il est plus judicieux d’utiliser la fonction all.equal() pour comparer
deux nombres, car celle-ci comporte un argument de tol´ erance num´ erique.
> all.equal(1.0-0.9,0.1,tol=10^(-6))
[1] TRUE
Attention
Il ne faut pas utiliser des constructions comme while(x != 0) ou
if (x != 0). En effet, si x prend par hasard une valeur comme 1.00.9-0.1 lors de l’ex´ ecution de votre code, les deux instructions pr´ ec´ edentes ne se comporteront pas comme pr´ evu. Il faut les remplacer par
while(!isTRUE(all.equal(x,0))) et if(!isTRUE(all.equal(x,0))).
Nous laissons au lecteur le soin de comprendre les sorties ci-dessous.
> as.integer(100 * (1-.34))
[1] 65
> floor(100 * (1-.34))
[1] 65
> round(100 * (1-.34))
[1] 66
> 100 * (1-.34)-66
[1] -1.421085e-14
> floor(100 * (1-.38))
[1] 62
> round(100 * (1-.38))
[1] 62
> 100 * (1-.38)-62
[1] 0
Précédent

- 175/701

Suivant