SlideShare une entreprise Scribd logo
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 logiciel (niveau III)
à l’AFPA d’Angers
consultant en gestion du cycle de vie du logiciel
(forges logicielles)

•
•
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.
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!
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
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.0999999999999999
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.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 ».
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 !
Exemples de format de stockage
Shaker technologies Javascript-IEEE754 version 1.0


 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.
Le nombre 2 est stocké (+1, 1, 1), c'est-à-dire : 2 = (+1) * 1 * (2 ^ 1).
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égatif
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).
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).
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.
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); // affiche 123456789012345660
var n2 = 123456789012345673;
console.log(n2); // affiche 123456789012345680
Mini, mini, mini
Shaker technologies Javascript-IEEE754 version 1.0

console.log(1.00000000000000009);// affiche 1
console.log(0.0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
0000000000000000001); // affiche 1e-323
console.log(0.0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
00000000000000000001); // affiche 0
" Il faut une infinie patience pour attendre toujours ce
qui n'arrive jamais. " (PIERRE DAC)
Shaker technologies Javascript-IEEE754 version 1.0

console.log(99999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999); //affiche 1e+308
console.log(99999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
9999); //affiche Infinity
" 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
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 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.
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 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");
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);
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);
Objectif atteint?

Shaker technologies Javascript-IEEE754 version 1.0

Bilan
Shaker technologies Javascript-IEEE754 version 1.0

Merci de votre attention.

Contenu connexe

PPTX
Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?
PDF
Presentation Csharp et winforms
PPTX
ALF 11 - Diagramme de flux de contrôle et WebAssembly
PDF
Python avancé : Classe et objet
PDF
Héritage et redéfinition de méthode
PDF
Cours matlab gpe
PPTX
mis
PDF
Chapitre 1 rappel
Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?
Presentation Csharp et winforms
ALF 11 - Diagramme de flux de contrôle et WebAssembly
Python avancé : Classe et objet
Héritage et redéfinition de méthode
Cours matlab gpe
mis
Chapitre 1 rappel

Tendances (17)

PPTX
ALF 9 - Generation de code
PPTX
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
PDF
Tests unitaires : Utilisation de la librairie CUnit
PDF
Composition, agrégation et immuabilité
PPTX
Environnement de développement de bases de données
PDF
Soirée Ceylon avec Stéphane Epardaud
PDF
Matlab
PDF
Part1
PDF
Chapitre 1 rappel
PPTX
Visual studio
PDF
Support matlab st
PDF
Type abstrait de données
PDF
Chapitre5: Classes et objets
PDF
INF120 - Algo DUT SRC1 - Cours 2 (2012)
DOCX
Tp 1 introduction à matlab
PPTX
Vbisigk
PPTX
Javascript un langage supérieur
ALF 9 - Generation de code
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Tests unitaires : Utilisation de la librairie CUnit
Composition, agrégation et immuabilité
Environnement de développement de bases de données
Soirée Ceylon avec Stéphane Epardaud
Matlab
Part1
Chapitre 1 rappel
Visual studio
Support matlab st
Type abstrait de données
Chapitre5: Classes et objets
INF120 - Algo DUT SRC1 - Cours 2 (2012)
Tp 1 introduction à matlab
Vbisigk
Javascript un langage supérieur
Publicité

En vedette (20)

PDF
Breton organic food know-how at BIOFACH
PPTX
Yeison fabian
PDF
NovaTec Company Overview
PPTX
Deutche Pop und elektronische
PDF
2017 0023 bases convocatoria md ecuador ind.aux.agricola.
PDF
María Pilar Diezhandino Nieto - Narraciones Gitanas
PPTX
Trabajo final educar
PDF
Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...
PPT
ReDiseñando Eros - Amar a Todos los Seres 1b
PDF
Catálogo tarima exterior Timbertech
PDF
Hoja de vida unach ec. patricio sanchez cuesta
PDF
Unit 2: Pertolongan Cemas
PDF
Budování a rozvoj adaptivní organizace
PDF
SEMINARIO EL EMPRENDEDOR SOCIAL en ESCUELA DE FORMACION SOCIAL
PDF
El Hombrecillo De Papel 6
PDF
Discover the power of crowdsourcing
PPT
Gingivitis
DOCX
Edad antigua
PPTX
Amoxicilina
PDF
ES2015 (ES6) Overview
Breton organic food know-how at BIOFACH
Yeison fabian
NovaTec Company Overview
Deutche Pop und elektronische
2017 0023 bases convocatoria md ecuador ind.aux.agricola.
María Pilar Diezhandino Nieto - Narraciones Gitanas
Trabajo final educar
Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...
ReDiseñando Eros - Amar a Todos los Seres 1b
Catálogo tarima exterior Timbertech
Hoja de vida unach ec. patricio sanchez cuesta
Unit 2: Pertolongan Cemas
Budování a rozvoj adaptivní organizace
SEMINARIO EL EMPRENDEDOR SOCIAL en ESCUELA DE FORMACION SOCIAL
El Hombrecillo De Papel 6
Discover the power of crowdsourcing
Gingivitis
Edad antigua
Amoxicilina
ES2015 (ES6) Overview
Publicité

Similaire à IEEE754-pourquoi_les_calculs_informatiques_sont_faux (20)

PPTX
Javascript : que fait ce code?
PDF
Slides octave1
PPTX
C# 7 - Nouveautés
PDF
Introduction à MATLAB et Simulink.pdf
PDF
Introduction à MATLAB et Simulink.pdf
PDF
Tp1 matlab
PDF
Compte rendu Blend Web Mix 2015
PPTX
Développer en natif avec C++11
PDF
Mat lab1
PDF
Manuel des TP : Atelier Web 2
PDF
Découverte du moteur de rendu du projet Spartan
PPTX
Cours 1 bases de matlab 2eme annees
PDF
Explication du micro
PPTX
Présentation Javascript à l'ESI (Alger)
PDF
Qualité logicielle
PPTX
Cours tp2
PDF
Lustre
PDF
logistic_regression_ml.pdf
PDF
2015: L'année d'Elixir, Code, écosystème et communauté
Javascript : que fait ce code?
Slides octave1
C# 7 - Nouveautés
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdf
Tp1 matlab
Compte rendu Blend Web Mix 2015
Développer en natif avec C++11
Mat lab1
Manuel des TP : Atelier Web 2
Découverte du moteur de rendu du projet Spartan
Cours 1 bases de matlab 2eme annees
Explication du micro
Présentation Javascript à l'ESI (Alger)
Qualité logicielle
Cours tp2
Lustre
logistic_regression_ml.pdf
2015: L'année d'Elixir, Code, écosystème et communauté

Plus de Ruau Mickael (20)

PDF
#SprintMission semaine 3/4 : 1 mission en 1 mois !
PDF
Portfolio Agile Master - Références de Mickael Ruau
PDF
#SprintMission semaine 2/4 : 1 mission en 1 mois !
PDF
#SprintMission semaine 1/4 : 1 mission en 1 mois !
PDF
Dix Program Managers et profils QA-Automation
PPTX
Prisonware épisode 1 - qualité logicielle
PDF
Agile Laval - Atelier interactif sur Scrum Shock Therapy
PPTX
Humantalks - La malédiction de la V2 (Human Talks Angers du 12 septembre 2023)
PPTX
MentorTech_-_masterclass_diversifier_et_securiser_ses_revenus.pptx
PPTX
Panorama de méthodes agiles
PDF
Green web
PPTX
Javascript objet : que fait ce code ?
PPTX
Javascript - Fonctions : que fait ce code ?
PPTX
Javascript - Tableaux : que fait ce code ?
PPTX
Google Design Sprints v1-1
PPTX
Value Proposition Design
PDF
Pour des données fiables
PDF
Animer une formation : les bases
PPTX
Qui a peur des estimations ?
PDF
hacking learning
#SprintMission semaine 3/4 : 1 mission en 1 mois !
Portfolio Agile Master - Références de Mickael Ruau
#SprintMission semaine 2/4 : 1 mission en 1 mois !
#SprintMission semaine 1/4 : 1 mission en 1 mois !
Dix Program Managers et profils QA-Automation
Prisonware épisode 1 - qualité logicielle
Agile Laval - Atelier interactif sur Scrum Shock Therapy
Humantalks - La malédiction de la V2 (Human Talks Angers du 12 septembre 2023)
MentorTech_-_masterclass_diversifier_et_securiser_ses_revenus.pptx
Panorama de méthodes agiles
Green web
Javascript objet : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
Javascript - Tableaux : que fait ce code ?
Google Design Sprints v1-1
Value Proposition Design
Pour des données fiables
Animer une formation : les bases
Qui a peur des estimations ?
hacking learning

IEEE754-pourquoi_les_calculs_informatiques_sont_faux

  • 1. Shaker technologies Javascript-IEEE754 version 1.0 IEEE754 Manipulation des nombres flottants : exemples avec Javascript
  • 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. 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. 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. 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. Shaker technologies Javascript-IEEE754 version 1.0 La minute nécessaire
  • 7. Etonnant, non?! Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.1+0.2); //0.30000000000000004
  • 8. Etonnant, non?! (suite) Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.1*0.2); //0.020000000000000004
  • 9. Etonnant, non?! (re-suite) Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.11/0.10); //1.0999999999999999
  • 10. Etonnant, non?! (fin) Shaker technologies Javascript-IEEE754 version 1.0 console.log(0.3 - 0.2 ); //0.09999999999999998
  • 11. Shaker technologies Javascript-IEEE754 version 1.0 Explication
  • 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. 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. Exemples de format de stockage Shaker technologies Javascript-IEEE754 version 1.0   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. Le nombre 2 est stocké (+1, 1, 1), c'est-à-dire : 2 = (+1) * 1 * (2 ^ 1).
  • 15. Décomposons un flottant Shaker technologies Javascript-IEEE754 version 1.0 Personne ne coule?
  • 16. Le signe Shaker technologies Javascript-IEEE754 version 1.0 • • (+1) si le nombre est positif (-1) si le nombre est négatif
  • 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. 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. 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.
  • 21. D'autres exemples... Shaker technologies Javascript-IEEE754 version 1.0 ... Encore?
  • 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. Mini, mini, mini Shaker technologies Javascript-IEEE754 version 1.0 console.log(1.00000000000000009);// affiche 1 console.log(0.0000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 0000000000000000001); // affiche 1e-323 console.log(0.0000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 00000000000000000001); // affiche 0
  • 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(99999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999); //affiche 1e+308 console.log(99999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 9999); //affiche Infinity
  • 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. Shaker technologies Javascript-IEEE754 version 1.0 Explication
  • 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. Shaker technologies Javascript-IEEE754 version 1.0 Quelles solutions?
  • 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. 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. 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. Objectif atteint? Shaker technologies Javascript-IEEE754 version 1.0 Bilan
  • 33. Shaker technologies Javascript-IEEE754 version 1.0 Merci de votre attention.