SlideShare une entreprise Scribd logo
1  sur  33
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

Tendances

mis
mismis
mis
ISIG
 
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
ISIG
 
Visual studio
Visual studioVisual studio
Visual studio
ISIG
 
INF120 - Algo DUT SRC1 - Cours 2 (2012)
INF120 - Algo DUT SRC1 - Cours 2 (2012)INF120 - Algo DUT SRC1 - Cours 2 (2012)
INF120 - Algo DUT SRC1 - Cours 2 (2012)
PGambette
 
Vbisigk
VbisigkVbisigk
Vbisigk
ISIG
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
Fredy Fadel
 

Tendances (19)

mis
mismis
mis
 
Chapitre 1 rappel
Chapitre 1   rappelChapitre 1   rappel
Chapitre 1 rappel
 
ALF 9 - Generation de code
ALF 9 - Generation de codeALF 9 - Generation de code
ALF 9 - Generation de code
 
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
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
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
 
Soirée Ceylon avec Stéphane Epardaud
Soirée Ceylon avec Stéphane EpardaudSoirée Ceylon avec Stéphane Epardaud
Soirée Ceylon avec Stéphane Epardaud
 
Matlab
MatlabMatlab
Matlab
 
Part1
Part1Part1
Part1
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 
Visual studio
Visual studioVisual studio
Visual studio
 
Support matlab st
Support matlab stSupport matlab st
Support matlab st
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
INF120 - Algo DUT SRC1 - Cours 2 (2012)
INF120 - Algo DUT SRC1 - Cours 2 (2012)INF120 - Algo DUT SRC1 - Cours 2 (2012)
INF120 - Algo DUT SRC1 - Cours 2 (2012)
 
Tp 1 introduction à matlab
Tp 1 introduction à matlabTp 1 introduction à matlab
Tp 1 introduction à matlab
 
Vbisigk
VbisigkVbisigk
Vbisigk
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 

En vedette

Yeison fabian
Yeison fabianYeison fabian
Yeison fabian
Jhohan Cx
 
Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...
Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...
Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...
Isla de Tenerife Vívela
 
Hoja de vida unach ec. patricio sanchez cuesta
Hoja de vida unach ec. patricio sanchez cuestaHoja de vida unach ec. patricio sanchez cuesta
Hoja de vida unach ec. patricio sanchez cuesta
Patricio Sánchez
 
Unit 2: Pertolongan Cemas
Unit 2: Pertolongan CemasUnit 2: Pertolongan Cemas
Unit 2: Pertolongan Cemas
mokhtar
 

En vedette (20)

Breton organic food know-how at BIOFACH
Breton organic food know-how at BIOFACHBreton organic food know-how at BIOFACH
Breton organic food know-how at BIOFACH
 
Yeison fabian
Yeison fabianYeison fabian
Yeison fabian
 
NovaTec Company Overview
NovaTec Company OverviewNovaTec Company Overview
NovaTec Company Overview
 
Deutche Pop und elektronische
Deutche Pop und elektronischeDeutche Pop und elektronische
Deutche Pop und elektronische
 
2017 0023 bases convocatoria md ecuador ind.aux.agricola.
2017 0023 bases convocatoria md ecuador ind.aux.agricola.2017 0023 bases convocatoria md ecuador ind.aux.agricola.
2017 0023 bases convocatoria md ecuador ind.aux.agricola.
 
María Pilar Diezhandino Nieto - Narraciones Gitanas
María Pilar Diezhandino Nieto -  Narraciones GitanasMaría Pilar Diezhandino Nieto -  Narraciones Gitanas
María Pilar Diezhandino Nieto - Narraciones Gitanas
 
Trabajo final educar
Trabajo final educarTrabajo final educar
Trabajo final educar
 
Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...
Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...Catálogo de las plantas existentes en el Jardín de Aclimatación de la Orotava...
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
ReDiseñando Eros - Amar a Todos los Seres 1bReDiseñando Eros - Amar a Todos los Seres 1b
ReDiseñando Eros - Amar a Todos los Seres 1b
 
Catálogo tarima exterior Timbertech
Catálogo tarima exterior TimbertechCatálogo tarima exterior Timbertech
Catálogo tarima exterior Timbertech
 
Hoja de vida unach ec. patricio sanchez cuesta
Hoja de vida unach ec. patricio sanchez cuestaHoja de vida unach ec. patricio sanchez cuesta
Hoja de vida unach ec. patricio sanchez cuesta
 
Unit 2: Pertolongan Cemas
Unit 2: Pertolongan CemasUnit 2: Pertolongan Cemas
Unit 2: Pertolongan Cemas
 
Budování a rozvoj adaptivní organizace
Budování a rozvoj adaptivní organizaceBudování a rozvoj adaptivní organizace
Budování a rozvoj adaptivní organizace
 
SEMINARIO EL EMPRENDEDOR SOCIAL en ESCUELA DE FORMACION SOCIAL
SEMINARIO EL EMPRENDEDOR SOCIAL en ESCUELA DE FORMACION SOCIALSEMINARIO EL EMPRENDEDOR SOCIAL en ESCUELA DE FORMACION SOCIAL
SEMINARIO EL EMPRENDEDOR SOCIAL en ESCUELA DE FORMACION SOCIAL
 
El Hombrecillo De Papel 6
El Hombrecillo De Papel 6El Hombrecillo De Papel 6
El Hombrecillo De Papel 6
 
Discover the power of crowdsourcing
Discover the power of crowdsourcingDiscover the power of crowdsourcing
Discover the power of crowdsourcing
 
Gingivitis
GingivitisGingivitis
Gingivitis
 
Edad antigua
Edad antiguaEdad antigua
Edad antigua
 
Amoxicilina
AmoxicilinaAmoxicilina
Amoxicilina
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overview
 

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 octave1
issaslide
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
fouadDD
 
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
Tarik Taleb Bendiab
 
Explication du micro
Explication du microExplication du micro
Explication du micro
louminho
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
cyrilgandon
 

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
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
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
 
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
 
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
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
 
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 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
 
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)
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Cours tp2
Cours tp2Cours tp2
Cours tp2
 
Lustre
LustreLustre
Lustre
 
logistic_regression_ml.pdf
logistic_regression_ml.pdflogistic_regression_ml.pdf
logistic_regression_ml.pdf
 
2015: L'année d'Elixir, Code, écosystème et communauté
2015: L'année d'Elixir, Code, écosystème et communauté2015: L'année d'Elixir, Code, écosystème et communauté
2015: L'année d'Elixir, Code, écosystème et communauté
 

Plus de Ruau 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
 
L'investissement proportionnel en formation
L'investissement proportionnel en formationL'investissement proportionnel en formation
L'investissement proportionnel en formation
Ruau Mickael
 
Pour des données fiables
Pour des données fiablesPour des données fiables
Pour des données fiables
Ruau 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 bases
Ruau Mickael
 
Qui a peur des estimations ?
Qui a peur des estimations ?Qui a peur des estimations ?
Qui a peur des estimations ?
Ruau 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 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.