Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.javascript > #3069

Re: Formatage de nombre

From Olivier Miakinen <om+news@miakinen.net>
Newsgroups fr.comp.lang.javascript
Subject Re: Formatage de nombre
Date 2016-08-22 22:58 +0200
Organization There's no cabale
Message-ID <npfp0p$137u$1@cabale.usenet-fr.net> (permalink)
References <nocrhv$rgj$1@usenet.pasdenom.info> <57aa4592$0$7969$426a34cc@news.free.fr> <nodp6v$sj5$1@usenet.pasdenom.info> <npf0rb$bpf$1@cabale.usenet-fr.net> <npffhb$dn4$1@usenet.pasdenom.info>

Show all headers | View raw


Le 22/08/2016 20:16, Gloops a écrit :
>>>
>>> Je m'étais figuré que 0.1 + 0.2 était la blague potache des créateurs de
>>> Javascript, et que pour le reste ils allaient se tenir à carreau.
>>
>> Ce n'est pas une blague, c'est juste le prix à payer quand on utilise
>> des nombres décimaux représentés sous forme binaire (représentation
>> IEEE754 sur 64 bits dans le cas de JavaScript).
>>
>> [...]
> 
> Donc, on commet une erreur d'arrondi à la fin parce que la 
> représentation n'en a pas :)

Euh... non. Ou alors je n'ai pas compris ce que tu veux dire.

Prenons un autre exemple plus simple, en supposant que la représentation
binaire a exactement 4 bits après la virgule (ce n'est pas comme ça que
fonctionne la norme IEEE754 mais on retrouvera le même problème).


Le premier bit après la virgule vaut 1/2 soit 0,5. Le second bit vaut
1/4 soit 0,25. Le troisième vaut 0,125 et le quatrième 0,0625. Du coup
les valeurs possibles entre 0 et 1 sont les suivantes :

 binaire = décimal
  0,0000 = 0
  0,0001 = 0,0625
  0,0010 = 0,125
  0,0011 = 0,1875
  0,0100 = 0,25
  0,0101 = 0,3125
  0,0110 = 0,375
  0,0111 = 0,4375
  0,1000 = 0,5
  0,1001 = 0,5625
  ...
  0,1111 = 0,9375
  1,0000 = 1

Parmi les neuf valeurs décimales 0,1 ; 0,2 ; ... ; 0,9 seule 0,5 est
représentable exactement en binaire (c'est 0,1000) et toutes les
autres sont approchées. Par exemple, 0,1 en décimal est approchée au
mieux par 0,0010 en binaire qui vaut en réalité 0,125 en décimal :

 0,0 <-> 0,0000 = 0
 0,1 <-> 0,0010 = 0,125
 0,2 <-> 0,0011 = 0,1875
 0,3 <-> 0,0101 = 0,3125
 0,4 <-> 0,0110 = 0,375
 ...

Regardons maintenant ce qui se passe quand on multiplie par 3 la
représentation binaire de 0,1 (0,0010 binaire qui vaut en réalité
0,125 en décimal). Le résultat est 0,0110 en binaire qui est la
représentation binaire de 0,4 en décimal (en réalité 0,375).
À cause des différences de représentations, on pourrait croire
que 3 × 0,1 = 0,4 alors que c'est seulement 3 × 0,125 = 0,375.

> Il n'y a que Javascript à faire le gag, ou je me trompe ?

Pas du tout. Ce « gag » comme tu dis concerne tous les systèmes de
représentation des nombres dans une base (ici la base 2) suffisamment
différente de celle d'affichage (en l'occurrence la base 10). Si tu
ne vois pas ce gag dans d'autres langages, par exemple en C, c'est
qu'ils arrondissent le résultat à quelques chiffres seulement avant
l'affichage.

Exemple en C, avec un affichage de 0,1 avec 6 chiffres après la
virgule, puis avec 50 chiffres après la virgule :

  printf("%.6f\n", 0.1);
  -> 0.100000

  printf("%.50f\n", 0.1);
  -> 0.10000000000000000555111512312578270211815834045410

> Je m'étais dit que j'allais consacrer une demi-journée à comprendre 
> comment se bidouille cette affaire, mais ... il faut une demi-journée 
> disponible :)

Si tu n'as pas le temps de comprendre ce qui se passe, alors au moins
retiens une chose : c'est qu'il ne faut pas faire de calculs avec des
nombres décimaux si tu peux les faire avec des nombres entiers -- cf.
mon exemple des euros et des centimes.

-- 
Olivier Miakinen

Back to fr.comp.lang.javascript | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-09 17:06 +0200
  Re: Formatage de nombre SAM <stephanemoriaux.NoAdmin@wanadoo.fr.invalid> - 2016-08-09 23:05 +0200
    Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-10 01:21 +0200
    Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-10 01:32 +0200
      Re: Formatage de nombre Olivier Miakinen <om+news@miakinen.net> - 2016-08-22 16:05 +0200
        Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-22 20:16 +0200
          Re: Formatage de nombre Olivier Miakinen <om+news@miakinen.net> - 2016-08-22 22:58 +0200
            Re: Formatage de nombre Gloops <gloops@zailes.invalid.org.invalid> - 2016-08-23 14:50 +0200

csiph-web