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


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

Re: Formatage de nombre

From Gloops <gloops@zailes.invalid.org.invalid>
Newsgroups fr.comp.lang.javascript
Subject Re: Formatage de nombre
Date 2016-08-23 14:50 +0200
Organization Serveur de salon
Message-ID <nphgr1$noq$1@usenet.pasdenom.info> (permalink)
References (1 earlier) <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> <npfp0p$137u$1@cabale.usenet-fr.net>

Show all headers | View raw


Le 22/08/2016 à 22:58, Olivier Miakinen a écrit :
> 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.
>


Ah, il faut avouer que quand c'est bien expliqué ça va beaucoup plus vite :)

Back to fr.comp.lang.javascript | Previous | NextPrevious 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