Shaker technologies Javascript-IEEE754 version 1.0

IEEE754
Manipulation des nombres flottants :
exemples avec Javascript
Human talker
Shaker technologies Javascript-IEEE754 version 1.0

Mickaël Ruau :
● formateur pour le titre développeur logi...
Objectif
Shaker technologies Javascript-IEEE754 version 1.0

A la fin de cette présentation, vous maîtriserez la
manipulat...
Disclaimer
Shaker technologies Javascript-IEEE754 version 1.0

Le but est de sensibiliser
aux problèmes liés aux
calculs i...
Références
Shaker technologies Javascript-IEEE754 version 1.0

http://blog.oaxoa.com/2008/03/22/weird-math-aka-ieee-754dou...
Shaker technologies Javascript-IEEE754 version 1.0

La minute nécessaire
Etonnant, non?!
Shaker technologies Javascript-IEEE754 version 1.0

console.log(0.1+0.2); //0.30000000000000004
Etonnant, non?! (suite)
Shaker technologies Javascript-IEEE754 version 1.0

console.log(0.1*0.2); //0.020000000000000004
Etonnant, non?! (re-suite)
Shaker technologies Javascript-IEEE754 version 1.0

console.log(0.11/0.10); //1.099999999999999...
Etonnant, non?! (fin)
Shaker technologies Javascript-IEEE754 version 1.0

console.log(0.3 - 0.2 ); //0.09999999999999998
Shaker technologies Javascript-IEEE754 version 1.0

Explication
La cancellation
Shaker technologies Javascript-IEEE754 version 1.0

http://fr.wikipedia.org/wiki/Virgule_flottante#Pr.C3.A...
Pourquoi 0.1 n’est pas 0.1?
Shaker technologies Javascript-IEEE754 version 1.0

http://www.haypocalc.com/wiki/Standards_IE...
Exemples de format de stockage
Shaker technologies Javascript-IEEE754 version 1.0

■ Le nombre 2 est stocké (+1, 1, 1),
c'...
Décomposons un flottant

Shaker technologies Javascript-IEEE754 version 1.0

Personne ne coule?
Le signe
Shaker technologies Javascript-IEEE754 version 1.0

● (+1) si le nombre est positif
● (-1) si le nombre est négat...
La mantisse
Shaker technologies Javascript-IEEE754 version 1.0

● Si le nombre est supérieur à 1.5, il faut le diviser
suc...
Exemple : x = -10
Shaker technologies Javascript-IEEE754 version 1.0

● Le signe est égal à -1, car le nombre est négatif....
Quelqu’un peut le faire pour moi?
Shaker technologies Javascript-IEEE754 version 1.0

http://babbage.cs.qc.cuny.edu/IEEE-7...
Shaker technologies Javascript-IEEE754 version 1.0
D'autres exemples...

Shaker technologies Javascript-IEEE754 version 1.0

... Encore?
Trop c'est trop!
Shaker technologies Javascript-IEEE754 version 1.0

var n1 = 123456789012345672;
console.log(n1); // affi...
Mini, mini, mini
Shaker technologies Javascript-IEEE754 version 1.0

console.log(1.00000000000000009);// affiche 1
console...
" Il faut une infinie patience pour attendre toujours ce
qui n'arrive jamais. " (PIERRE DAC)
Shaker technologies Javascrip...
" Il faut toujours prendre le maximum de risques avec
le maximum de précautions. " Rudyard Kipling
Shaker technologies Jav...
Shaker technologies Javascript-IEEE754 version 1.0

Explication
IEEE 754 overflow
Shaker technologies Javascript-IEEE754 version 1.0

http://fr.wikipedia.org/wiki/Virgule_flottante
Les c...
Shaker technologies Javascript-IEEE754 version 1.0

Quelles solutions?
Number() = IEEE 64 bit
Shaker technologies Javascript-IEEE754 version 1.0

JavaScript is dynamically typed and will often ...
https://github.com/dtrebbien/BigDecimal.js
Shaker technologies Javascript-IEEE754 version 1.0

Decimal Types
The best deci...
https://github.com/dtrebbien/BigDecimal.js
Shaker technologies Javascript-IEEE754 version 1.0

How to Round
var num = 5.12...
Objectif atteint?

Shaker technologies Javascript-IEEE754 version 1.0

Bilan
Shaker technologies Javascript-IEEE754 version 1.0

Merci de votre attention.
Prochain SlideShare
Chargement dans…5
×

IEEE754-pourquoi_les_calculs_informatiques_sont_faux

255 vues

Publié le

La norme IEEE754 définit la représentation en mémoire et les règles de calcul pour les nombres flottants.
IEEE754 est utilisée par la plupart des langages informatiques.
Cette norme induit des effets de bord qui provoquent des résultats erronés lors de certaines opérations mathématiques.

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
255
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1
Actions
Partages
0
Téléchargements
6
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

IEEE754-pourquoi_les_calculs_informatiques_sont_faux

  1. 1. Shaker technologies Javascript-IEEE754 version 1.0 IEEE754 Manipulation des nombres flottants : exemples avec Javascript
  2. 2. Human talker Shaker technologies Javascript-IEEE754 version 1.0 Mickaël Ruau : ● formateur pour le titre développeur logiciel (niveau III) à l’AFPA d’Angers ● consultant en gestion du cycle de vie du logiciel (forges logicielles)
  3. 3. Objectif Shaker technologies Javascript-IEEE754 version 1.0 A la fin de cette présentation, vous maîtriserez la manipulation des nombres à virgule flottante. - Vous comprendrez les effets de bords liés aux arrondis de la norme IEEE754 - Vous serez capables d'améliorer l'exactitude des calculs sur les nombres à virgule flottante.
  4. 4. Disclaimer Shaker technologies Javascript-IEEE754 version 1.0 Le but est de sensibiliser aux problèmes liés aux calculs informatiques, notamment en matière financière (comptabilité, paie, ecommerce...). Je ne suis pas mathématicien. Je n’ai pas écrit la norme IEEE754, je ne la connais pas par coeur!
  5. 5. Références Shaker technologies Javascript-IEEE754 version 1.0 http://blog.oaxoa.com/2008/03/22/weird-math-aka-ieee-754double-precision-floating-point-number-sukcs/ http://grouper.ieee.org/groups/754/faq.html http://www.haypocalc.com/wiki/Standards_IEEE_754_et_854 http://floating-point-gui.de/languages/javascript/ http://www.ecmascript.org/ Standard ECMA-262 3rd Edition - December 1999 ECMA-262 5.1 Edition - June 2011
  6. 6. Shaker technologies Javascript-IEEE754 version 1.0 La minute nécessaire
  7. 7. Etonnant, non?! Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.1+0.2); //0.30000000000000004
  8. 8. Etonnant, non?! (suite) Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.1*0.2); //0.020000000000000004
  9. 9. Etonnant, non?! (re-suite) Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.11/0.10); //1.0999999999999999
  10. 10. Etonnant, non?! (fin) Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.3 - 0.2 ); //0.09999999999999998
  11. 11. Shaker technologies Javascript-IEEE754 version 1.0 Explication
  12. 12. La cancellation Shaker technologies Javascript-IEEE754 version 1.0 http://fr.wikipedia.org/wiki/Virgule_flottante#Pr.C3.A9cautions_d.27emploi Les calculs en virgule flottante (...) présentent divers désagréments, notamment leur précision limitée, qui se traduit par des arrondis. (...) Pour cette raison, les travaux de comptabilité ne sont pas effectués en virgule flottante, car tout doit tomber juste au centième près. En particulier, la soustraction de deux nombres très proches provoque une grande perte de précision relative : on parle de « cancellation ».
  13. 13. Pourquoi 0.1 n’est pas 0.1? Shaker technologies Javascript-IEEE754 version 1.0 http://www.haypocalc.com/wiki/Standards_IEEE_754_et_854 En gros, on stocke les nombres sous la forme : (signe, mantisse, exposant) ce qui donne x = signe * mantisse * (2 ^ exposant). Le signe vaut +1 ou -1, la mantisse est un nombre réel tel que 1.0 <= mantisse < 2.0, et l'exposant est une valeur entière. Bien sûr, l'ensemble est codé en binaire !
  14. 14. Exemples de format de stockage Shaker technologies Javascript-IEEE754 version 1.0 ■ Le nombre 2 est stocké (+1, 1, 1), c'est-à-dire : 2 = (+1) * 1 * (2 ^ 1). ■ Le nombre 3 est stocké (+1, 1.5, 1) : 3 = (+1) * 1.5 * (2 ^ 1). ■ Le nombre 10 est stocké (+1, 1.25, 3) : 10 = (+1) * 1.25 * 2^3.
  15. 15. Décomposons un flottant Shaker technologies Javascript-IEEE754 version 1.0 Personne ne coule?
  16. 16. Le signe Shaker technologies Javascript-IEEE754 version 1.0 ● (+1) si le nombre est positif ● (-1) si le nombre est négatif
  17. 17. La mantisse Shaker technologies Javascript-IEEE754 version 1.0 ● Si le nombre est supérieur à 1.5, il faut le diviser successivement par deux, jusqu'à ce que sa valeur soit inférieure ou égale à 1.5 (l'exposant sera le nombre de division) ● Si le nombre est inférieur à 1, il faut le multiplier successivement par deux, jusqu'à ce que sa valeur soit supérieure ou égale à 1 (l'exposant sera le nombre opposé de divisions).
  18. 18. Exemple : x = -10 Shaker technologies Javascript-IEEE754 version 1.0 ● Le signe est égal à -1, car le nombre est négatif. ● On prend la valeur absolue : x=10. Comme sa valeur est supérieur à 1, on divise par 2 : x=5, exposant=1. On continue : x=2.5 et exposant=2, x=1.25 et exposant=3 : STOP ! Donc finalement, x=(-1) * 1.25 * (2^3).
  19. 19. Quelqu’un peut le faire pour moi? Shaker technologies Javascript-IEEE754 version 1.0 http://babbage.cs.qc.cuny.edu/IEEE-754/ This page lets you examine the relationships among binary and decimal numbers and three number formats described by the IEEE-754-2008 floating-point standard. You can enter a numeric value in any one of five formats, and see all five corresponding values : Decimal, Normalized Binary, Binary32 (single precision), Binary64 (double precision), and Binary128 (quad precision), along with analyses of the binary structure of the floatingpoint formats.
  20. 20. Shaker technologies Javascript-IEEE754 version 1.0
  21. 21. D'autres exemples... Shaker technologies Javascript-IEEE754 version 1.0 ... Encore?
  22. 22. Trop c'est trop! Shaker technologies Javascript-IEEE754 version 1.0 var n1 = 123456789012345672; console.log(n1); // affiche 123456789012345660 var n2 = 123456789012345673; console.log(n2); // affiche 123456789012345680
  23. 23. Mini, mini, mini Shaker technologies Javascript-IEEE754 version 1.0 console.log(1.00000000000000009);// affiche 1 console.log (0.0000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 0000000001); // affiche 1e-323 console.log (0.0000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 00000000001); // affiche 0
  24. 24. " Il faut une infinie patience pour attendre toujours ce qui n'arrive jamais. " (PIERRE DAC) Shaker technologies Javascript-IEEE754 version 1.0 console.log (99999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999); //affiche 1e+308 console.log (99999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999999999999); //affiche Infinity
  25. 25. " Il faut toujours prendre le maximum de risques avec le maximum de précautions. " Rudyard Kipling Shaker technologies Javascript-IEEE754 version 1.0 console.log(3+999999999999999);//affiche 1000000000000002 console.log(2+999999999999999);//affiche 1000000000000001 console.log(3+9999999999999999);//affiche 1000000000000004 console.log(2+9999999999999999);//affiche 1000000000000002 console.log(3+99999999999999999);//affiche 100000000000000000 console.log(2+99999999999999999);//affiche 100000000000000000
  26. 26. Shaker technologies Javascript-IEEE754 version 1.0 Explication
  27. 27. IEEE 754 overflow Shaker technologies Javascript-IEEE754 version 1.0 http://fr.wikipedia.org/wiki/Virgule_flottante Les calculs en virgule flottante sont pratiques, mais présentent divers désagréments, notamment : ● une plage d'exposants limitée, pouvant donner lieux à ○ des « overflows » (lorsque le résultat d'une opération est plus grand que la plus grande valeur représentable) ○ et à des « underflows » (lorsqu'un résultat est plus petit, en valeur absolue, que le plus petit flottant normalisé positif), ○ puis à des résultats n'ayant plus aucun sens.
  28. 28. Shaker technologies Javascript-IEEE754 version 1.0 Quelles solutions?
  29. 29. Number() = IEEE 64 bit Shaker technologies Javascript-IEEE754 version 1.0 JavaScript is dynamically typed and will often convert implicitly between strings and floating-point numbers (which are IEEE 64 bit values). To force a variable to floatingpoint, use the global parseFloat() function. var num = parseFloat("3.5");
  30. 30. https://github.com/dtrebbien/BigDecimal.js Shaker technologies Javascript-IEEE754 version 1.0 Decimal Types The best decimal type for JavaScript seems to be a port of Java’s BigDecimal class, which also supports rounding modes: var a = new BigDecimal("0.01"); var b = new BigDecimal("0.02"); var c = a.add(b); // 0.03 var d = c.setScale(1, BigDecimal.prototype.ROUND_HALF_UP);
  31. 31. https://github.com/dtrebbien/BigDecimal.js Shaker technologies Javascript-IEEE754 version 1.0 How to Round var num = 5.123456; num.toPrecision(1) //returns 5 as string num.toPrecision(2) //returns 5.1 as string num.toPrecision(4) //returns 5.123 as string Using a specific rounding mode: new BigDecimal("1.25").setScale(1, BigDecimal.prototype. ROUND_HALF_UP);
  32. 32. Objectif atteint? Shaker technologies Javascript-IEEE754 version 1.0 Bilan
  33. 33. Shaker technologies Javascript-IEEE754 version 1.0 Merci de votre attention.

×