SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
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 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.
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.0000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
0000000001); // affiche 1e-323
console.log
(0.0000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
00000000001); // 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
(99999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999);
//affiche 1e+308
console.log
(99999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999);
//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

Tendances

Chapitre i introduction et motivations
Chapitre i introduction et motivationsChapitre i introduction et motivations
Chapitre i introduction et motivationsSana Aroussi
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de donnéesISIG
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
Visual studio
Visual studioVisual studio
Visual studioISIG
 
Vbisigk
VbisigkVbisigk
VbisigkISIG
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Aurélien Regat-Barrel
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de donnéesISIG
 
SdE 8 - Synchronisation de execution
SdE 8 - Synchronisation de executionSdE 8 - Synchronisation de execution
SdE 8 - Synchronisation de executionAlexandru Radovici
 
Support matlab st
Support matlab stSupport matlab st
Support matlab stN NASRI
 
Cours 1 bases de matlab 2eme annees
Cours 1   bases de matlab 2eme anneesCours 1   bases de matlab 2eme annees
Cours 1 bases de matlab 2eme anneesTarik Taleb Bendiab
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 

Tendances (19)

Chapitre i introduction et motivations
Chapitre i introduction et motivationsChapitre i introduction et motivations
Chapitre i introduction et motivations
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
Chapitre 1 rappel
Chapitre 1   rappelChapitre 1   rappel
Chapitre 1 rappel
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de données
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
Visual studio
Visual studioVisual studio
Visual studio
 
Vbisigk
VbisigkVbisigk
Vbisigk
 
Tp 1 introduction à matlab
Tp 1 introduction à matlabTp 1 introduction à matlab
Tp 1 introduction à matlab
 
Matlab
MatlabMatlab
Matlab
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 
Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de données
 
De Java à .NET
De Java à .NETDe Java à .NET
De Java à .NET
 
SdE 8 - Synchronisation de execution
SdE 8 - Synchronisation de executionSdE 8 - Synchronisation de execution
SdE 8 - Synchronisation de execution
 
Support matlab st
Support matlab stSupport matlab st
Support matlab st
 
Cours 1 bases de matlab 2eme annees
Cours 1   bases de matlab 2eme anneesCours 1   bases de matlab 2eme annees
Cours 1 bases de matlab 2eme annees
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 

En vedette

Presentación1 Multimedios
Presentación1 MultimediosPresentación1 Multimedios
Presentación1 MultimediosToledoJulieta
 
Difinicion de informatica educativa
Difinicion de informatica educativaDifinicion de informatica educativa
Difinicion de informatica educativaMarcelo Chicaiza A
 
ventajas de usar software libre
ventajas de usar software libreventajas de usar software libre
ventajas de usar software librehobbit1994
 
8 pasos y un motivo para una estrategia 2.0 - Caso Reyno Gourmet
8 pasos y un motivo para una estrategia 2.0 - Caso Reyno Gourmet8 pasos y un motivo para una estrategia 2.0 - Caso Reyno Gourmet
8 pasos y un motivo para una estrategia 2.0 - Caso Reyno GourmetIlusiona Creatividad
 
Diapositivas Cetares
Diapositivas CetaresDiapositivas Cetares
Diapositivas CetaresA4g
 
Consultas en access
Consultas en accessConsultas en access
Consultas en accessSara Silva
 
Internet+Parte+Ii
Internet+Parte+IiInternet+Parte+Ii
Internet+Parte+Iichalo25
 
5 ideas claves en ecommerce
5 ideas claves en ecommerce5 ideas claves en ecommerce
5 ideas claves en ecommerceLuis Chaquea
 
Curso Practico Marketing Online Implicaciones Legales
Curso Practico Marketing Online Implicaciones LegalesCurso Practico Marketing Online Implicaciones Legales
Curso Practico Marketing Online Implicaciones LegalesLuis Chaquea
 
Slideshare - web 2.0
Slideshare - web 2.0Slideshare - web 2.0
Slideshare - web 2.0wafabouricha
 

En vedette (20)

Informatica Educativa
Informatica EducativaInformatica Educativa
Informatica Educativa
 
Radhua
RadhuaRadhua
Radhua
 
Yapocitivas
YapocitivasYapocitivas
Yapocitivas
 
ESCAPADA ROMANTICA
ESCAPADA ROMANTICAESCAPADA ROMANTICA
ESCAPADA ROMANTICA
 
Presentación1 Multimedios
Presentación1 MultimediosPresentación1 Multimedios
Presentación1 Multimedios
 
Difinicion de informatica educativa
Difinicion de informatica educativaDifinicion de informatica educativa
Difinicion de informatica educativa
 
ventajas de usar software libre
ventajas de usar software libreventajas de usar software libre
ventajas de usar software libre
 
Gimp
GimpGimp
Gimp
 
8 pasos y un motivo para una estrategia 2.0 - Caso Reyno Gourmet
8 pasos y un motivo para una estrategia 2.0 - Caso Reyno Gourmet8 pasos y un motivo para una estrategia 2.0 - Caso Reyno Gourmet
8 pasos y un motivo para una estrategia 2.0 - Caso Reyno Gourmet
 
Diapositivas Cetares
Diapositivas CetaresDiapositivas Cetares
Diapositivas Cetares
 
Consultas en access
Consultas en accessConsultas en access
Consultas en access
 
Juan Zamorano Astorga.
Juan Zamorano Astorga.Juan Zamorano Astorga.
Juan Zamorano Astorga.
 
inernet
inernet inernet
inernet
 
el internet
el internet el internet
el internet
 
Internet+Parte+Ii
Internet+Parte+IiInternet+Parte+Ii
Internet+Parte+Ii
 
5 ideas claves en ecommerce
5 ideas claves en ecommerce5 ideas claves en ecommerce
5 ideas claves en ecommerce
 
Curso Practico Marketing Online Implicaciones Legales
Curso Practico Marketing Online Implicaciones LegalesCurso Practico Marketing Online Implicaciones Legales
Curso Practico Marketing Online Implicaciones Legales
 
Latin CACS 2009 224
Latin CACS 2009 224Latin CACS 2009 224
Latin CACS 2009 224
 
Latin cacs 2004 CC CZ
Latin cacs 2004 CC CZLatin cacs 2004 CC CZ
Latin cacs 2004 CC CZ
 
Slideshare - web 2.0
Slideshare - web 2.0Slideshare - web 2.0
Slideshare - web 2.0
 

Similaire à IEEE754-pourquoi_les_calculs_informatiques_sont_faux

Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?Ruau Mickael
 
Slides octave1
Slides octave1Slides octave1
Slides octave1issaslide
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfTarakBenslimane
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfTarakBenslimane
 
Explication du micro
Explication du microExplication du micro
Explication du microlouminho
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Faycel Chaoua
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Mat lab1
Mat lab1Mat lab1
Mat lab1fouadDD
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...StHack
 
Programmation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexeProgrammation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexeJiijishady
 
Scilab pour les vrais débutants
Scilab pour les vrais débutantsScilab pour les vrais débutants
Scilab pour les vrais débutantsScilab
 

Similaire à IEEE754-pourquoi_les_calculs_informatiques_sont_faux (20)

Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?
 
Slides octave1
Slides octave1Slides octave1
Slides octave1
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdf
 
Introduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdfIntroduction à MATLAB et Simulink.pdf
Introduction à MATLAB et Simulink.pdf
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Tp1 matlab
Tp1 matlab Tp1 matlab
Tp1 matlab
 
Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015
 
Explication du micro
Explication du microExplication du micro
Explication du micro
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
Cours tp2
Cours tp2Cours tp2
Cours tp2
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
Sthack 2015 - Aris "@aris_ada" Adamantiadis - DUAL_EC_DRBG : Une histoire de ...
 
Programmation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexeProgrammation lineaire algorithme_du_simplexe
Programmation lineaire algorithme_du_simplexe
 
Les bases du javascript
Les bases du javascriptLes bases du javascript
Les bases du javascript
 
Scilab pour les vrais débutants
Scilab pour les vrais débutantsScilab pour les vrais débutants
Scilab pour les vrais débutants
 

Plus de Ruau Mickael

Panorama de méthodes agiles
Panorama de méthodes agilesPanorama de méthodes agiles
Panorama de méthodes agilesRuau Mickael
 
Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Ruau Mickael
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Ruau Mickael
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Ruau Mickael
 
Google Design Sprints v1-1
Google Design Sprints v1-1Google Design Sprints v1-1
Google Design Sprints v1-1Ruau Mickael
 
Value Proposition Design
Value Proposition DesignValue Proposition Design
Value Proposition DesignRuau Mickael
 
L'investissement proportionnel en formation
L'investissement proportionnel en formationL'investissement proportionnel en formation
L'investissement proportionnel en formationRuau Mickael
 
Pour des données fiables
Pour des données fiablesPour des données fiables
Pour des données fiablesRuau Mickael
 
Like Me I'm Famous !
Like Me I'm Famous !Like Me I'm Famous !
Like Me I'm Famous !Ruau Mickael
 
Animer une formation : les bases
Animer une formation : les basesAnimer une formation : les bases
Animer une formation : les basesRuau Mickael
 
Qui a peur des estimations ?
Qui a peur des estimations ?Qui a peur des estimations ?
Qui a peur des estimations ?Ruau Mickael
 
Consignes épreuve de codage
Consignes épreuve de codageConsignes épreuve de codage
Consignes épreuve de codageRuau Mickael
 
Horreurs et recrutement
Horreurs et recrutementHorreurs et recrutement
Horreurs et recrutementRuau Mickael
 
Quelle(s) stratégie(s) de développement dans un monde en mouvement?
Quelle(s) stratégie(s) de développement dans un monde en mouvement?Quelle(s) stratégie(s) de développement dans un monde en mouvement?
Quelle(s) stratégie(s) de développement dans un monde en mouvement?Ruau Mickael
 
Sycfi - Twitter pour les formateurs v.1.1
Sycfi - Twitter pour les formateurs v.1.1Sycfi - Twitter pour les formateurs v.1.1
Sycfi - Twitter pour les formateurs v.1.1Ruau Mickael
 

Plus de Ruau Mickael (19)

Panorama de méthodes agiles
Panorama de méthodes agilesPanorama de méthodes agiles
Panorama de méthodes agiles
 
Green web
Green webGreen web
Green web
 
Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?
 
Google Design Sprints v1-1
Google Design Sprints v1-1Google Design Sprints v1-1
Google Design Sprints v1-1
 
Value Proposition Design
Value Proposition DesignValue Proposition Design
Value Proposition Design
 
L'investissement proportionnel en formation
L'investissement proportionnel en formationL'investissement proportionnel en formation
L'investissement proportionnel en formation
 
Pour des données fiables
Pour des données fiablesPour des données fiables
Pour des données fiables
 
Besoin d'aide ?
Besoin d'aide ?Besoin d'aide ?
Besoin d'aide ?
 
Like Me I'm Famous !
Like Me I'm Famous !Like Me I'm Famous !
Like Me I'm Famous !
 
Animer une formation : les bases
Animer une formation : les basesAnimer une formation : les bases
Animer une formation : les bases
 
Protocamp
ProtocampProtocamp
Protocamp
 
Qui a peur des estimations ?
Qui a peur des estimations ?Qui a peur des estimations ?
Qui a peur des estimations ?
 
hacking learning
hacking learninghacking learning
hacking learning
 
Consignes épreuve de codage
Consignes épreuve de codageConsignes épreuve de codage
Consignes épreuve de codage
 
Horreurs et recrutement
Horreurs et recrutementHorreurs et recrutement
Horreurs et recrutement
 
Quelle(s) stratégie(s) de développement dans un monde en mouvement?
Quelle(s) stratégie(s) de développement dans un monde en mouvement?Quelle(s) stratégie(s) de développement dans un monde en mouvement?
Quelle(s) stratégie(s) de développement dans un monde en mouvement?
 
Sycfi - Twitter pour les formateurs v.1.1
Sycfi - Twitter pour les formateurs v.1.1Sycfi - Twitter pour les formateurs v.1.1
Sycfi - Twitter pour les formateurs v.1.1
 

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 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. 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.0000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 0000000001); // affiche 1e-323 console.log (0.0000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 00000000001); // 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 (99999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999); //affiche 1e+308 console.log (99999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999999999999); //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.