Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > fr.comp.lang.javascript > #3071
| 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> |
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 | Next — Previous in thread | Find similar
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