SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
Shaker technologies Javascript-IEEE754 version 1.1 
IEEE754 
Manipulation des 
nombres flottants : 
exemples avec 
Javascript
Shaker technologies Javascript-IEEE754 version 1.1 
Human talker 
Mickaël Ruau : 
! 
• consultant en qualité logicielle 
(forges logicielles) 
• spécialiste de l’informatique 
médicale (norme DICOM) 
• formateur à l’AFPA d’Angers
Shaker technologies Javascript-IEEE754 version 1.1 
Références 
http://blog.oaxoa.com/2008/03/22/weird-math-aka-ieee-754- 
double-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.1 
Disclaimer 
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!
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1
La minute nécessaire 
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1 
Etonnant, non?! 
console.log(0.1+0.2); //0.30000000000000004
Shaker technologies Javascript-IEEE754 version 1.1 
Etonnant, non?! (suite) 
console.log(0.1*0.2); //0.020000000000000004
Shaker technologies Javascript-IEEE754 version 1.1 
Etonnant, non?! (re-suite) 
console.log(0.11/0.10); //1.0999999999999999
Shaker technologies Javascript-IEEE754 version 1.1 
Etonnant, non?! (fin) 
console.log(0.3 - 0.2 ); //0.09999999999999998
Explication 
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1 
La cancellation 
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. (...) 
! 
En particulier, la soustraction de deux nombres très 
proches provoque une grande perte de précision relative : 
on parle de « cancellation ».
Shaker technologies Javascript-IEEE754 version 1.1 
Pourquoi 0.1 n’est pas 0.1? 
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 !
Shaker technologies Javascript-IEEE754 version 1.1 
Exemples de format de stockage 
! 
▪ 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.
Shaker technologies Javascript-IEEE754 version 1.1 
Personne ne coule? 
Vers l’infini et au-delà avec les flottants…
Shaker technologies Javascript-IEEE754 version 1.1 
Passé les bornes, y’a plus de limite! 
console.log(1.00000000000000009);// affiche 1 
! 
var n1 = 123456789012345672; 
console.log(n1); // affiche 123456789012345660 
! 
var n2 = 123456789012345673; 
console.log(n2); // affiche 123456789012345680
Shaker technologies Javascript-IEEE754 version 1.1 
Mini, mini, mini 
console.log(1.00000000000000009);// affiche 1 
! 
console.log(0.000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000 
000001); // affiche 0
Shaker technologies Javascript-IEEE754 version 1.1 
" Il faut une infinie patience pour attendre toujours ce 
qui n'arrive jamais. " (PIERRE DAC) 
console.log(9999999999999999999999999999999999999 
99999999999999999999999999999999999999999999999 
99999999999999999999999999999999999999999999999 
99999999999999999999999999999999999999999999999 
99999999999999999999999999999999999999999999999 
99999999999999999999999999999999999999999999999 
9999999999999999999999999999999999999); 
//affiche Infinity
Shaker technologies Javascript-IEEE754 version 1.1 
" Il faut toujours prendre le maximum de risques avec 
le maximum de précautions. " Rudyard Kipling 
console.log(3+999999999999999); 
//affiche 1000000000000002 
! 
console.log(3+9999999999999999); 
//affiche 1000000000000004 
! 
console.log(3+99999999999999999); 
//affiche 100000000000000000 
! 
console.log(2+99999999999999999); 
//affiche 100000000000000000
Explication 
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1 
IEEE 754 overflow 
http://fr.wikipedia.org/wiki/Virgule_flottante 
La plage d'exposants est limitée : 
• « overflows » lorsque le résultat d'une opération est plus 
grand que la plus grande valeur représentable 
• « 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.1 
Quelles solutions? 
photo : http://blog.megdesk.com/computer-engineer-barbie-revised/
Shaker technologies Javascript-IEEE754 version 1.1 
Number() = IEEE 64 bit 
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 floating-point, use the global 
parseFloat() function. 
! 
var num = parseFloat("3.5");
Shaker technologies Javascript-IEEE754 version 1.1 
https://github.com/dtrebbien/BigDecimal.js 
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);
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1
Shaker technologies Javascript-IEEE754 version 1.1 
@HeforShe 
Dedicated to 
Pauline, 
Stéphanie, 
Sylvie, 
Mum… 
! 
With love and kisses. 
You girls rock in IT! 
! 
Credits : 
Photo : http://violasong.com/2010/03/what-a-computer-engineer-looks-like 
! 
https://computer-engineer-barbie.herokuapp.com 
Cette présentation constitue une parodie au sens de l’article L.122-5 
du Code de la Propriété Intellectuelle. 
This non-commercial transformative work constitutes fair use 
under Section 107 of the U.S. copyright act. 
Use of copyrighted material is necessary 
for the purpose of criticism and education, the images are only 
at the resolution necessary for this purpose, 
and this remix is clearly marked to avoid confusion with the original.

Weitere ähnliche Inhalte

Was ist angesagt?

mis
mismis
mis
ISIG
 
Vbisigk
VbisigkVbisigk
Vbisigk
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
 
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
 
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
 

Was ist angesagt? (14)

Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
SdE 8 - Synchronisation de execution
SdE 8 - Synchronisation de executionSdE 8 - Synchronisation de execution
SdE 8 - Synchronisation de execution
 
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
 
Cours javascript v1
Cours javascript v1Cours javascript v1
Cours javascript v1
 
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
 
mis
mismis
mis
 
Vbisigk
VbisigkVbisigk
Vbisigk
 
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
 
Ch42 reponses
Ch42 reponsesCh42 reponses
Ch42 reponses
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala
 
Visual studio
Visual studioVisual studio
Visual studio
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : 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 ?
 

Andere mochten auch

PresFLancini-Olivier-BatimentVLK
PresFLancini-Olivier-BatimentVLKPresFLancini-Olivier-BatimentVLK
PresFLancini-Olivier-BatimentVLK
FLOOBH
 
Questionnaires
QuestionnairesQuestionnaires
Questionnaires
sian_93
 
AMIGOS
AMIGOSAMIGOS
AMIGOS
MAYRIU
 
Catalogo Amway Marzo - Mayo 2010
Catalogo Amway Marzo - Mayo 2010Catalogo Amway Marzo - Mayo 2010
Catalogo Amway Marzo - Mayo 2010
lpchava
 
Problemas Proyectos Y Competencias
Problemas   Proyectos Y CompetenciasProblemas   Proyectos Y Competencias
Problemas Proyectos Y Competencias
DiegoVillada
 

Andere mochten auch (20)

Venita boodhoo
Venita boodhooVenita boodhoo
Venita boodhoo
 
Le Marché de la Mode Enfantine en Europe
Le Marché de la Mode Enfantine en EuropeLe Marché de la Mode Enfantine en Europe
Le Marché de la Mode Enfantine en Europe
 
La campagne Nespresso
La campagne NespressoLa campagne Nespresso
La campagne Nespresso
 
NESPRESSO MARKETING ANALYSIS 2014 Complete analysis
NESPRESSO MARKETING ANALYSIS 2014 Complete analysisNESPRESSO MARKETING ANALYSIS 2014 Complete analysis
NESPRESSO MARKETING ANALYSIS 2014 Complete analysis
 
PresFLancini-Olivier-BatimentVLK
PresFLancini-Olivier-BatimentVLKPresFLancini-Olivier-BatimentVLK
PresFLancini-Olivier-BatimentVLK
 
Reconstruyendo La Izquierda
Reconstruyendo La IzquierdaReconstruyendo La Izquierda
Reconstruyendo La Izquierda
 
Introduccion a XHTML
Introduccion a XHTMLIntroduccion a XHTML
Introduccion a XHTML
 
TEDx Rio de la Plata
TEDx Rio de la PlataTEDx Rio de la Plata
TEDx Rio de la Plata
 
Questionnaires
QuestionnairesQuestionnaires
Questionnaires
 
9152 convocatoria cai_05-2011
9152 convocatoria cai_05-20119152 convocatoria cai_05-2011
9152 convocatoria cai_05-2011
 
AMIGOS
AMIGOSAMIGOS
AMIGOS
 
Fin De Semana Romantico
Fin De Semana RomanticoFin De Semana Romantico
Fin De Semana Romantico
 
La Réunion : le 1er spot du monde pour le canyoning
La Réunion : le 1er spot du monde pour le canyoningLa Réunion : le 1er spot du monde pour le canyoning
La Réunion : le 1er spot du monde pour le canyoning
 
Catalogo Amway Marzo - Mayo 2010
Catalogo Amway Marzo - Mayo 2010Catalogo Amway Marzo - Mayo 2010
Catalogo Amway Marzo - Mayo 2010
 
SNCD - Livre collectif Délivrabilité
SNCD - Livre collectif DélivrabilitéSNCD - Livre collectif Délivrabilité
SNCD - Livre collectif Délivrabilité
 
Seminaire Soft Computing Interactive
Seminaire Soft Computing InteractiveSeminaire Soft Computing Interactive
Seminaire Soft Computing Interactive
 
Problemas Proyectos Y Competencias
Problemas   Proyectos Y CompetenciasProblemas   Proyectos Y Competencias
Problemas Proyectos Y Competencias
 
SOCIEDAD DE LA INFORMACION
SOCIEDAD DE LA INFORMACION SOCIEDAD DE LA INFORMACION
SOCIEDAD DE LA INFORMACION
 
Grupos
GruposGrupos
Grupos
 
Updatedelete
UpdatedeleteUpdatedelete
Updatedelete
 

Ähnlich wie Barbie explique 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
 

Ähnlich wie Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux! (20)

IEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_fauxIEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_faux
 
IEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_fauxIEEE754-pourquoi_les_calculs_informatiques_sont_faux
IEEE754-pourquoi_les_calculs_informatiques_sont_faux
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?
 
Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015
 
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
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Slides octave1
Slides octave1Slides octave1
Slides octave1
 
Renforçons notre Developer eXperience pour faire face aux menaces d'obsolesce...
Renforçons notre Developer eXperience pour faire face aux menaces d'obsolesce...Renforçons notre Developer eXperience pour faire face aux menaces d'obsolesce...
Renforçons notre Developer eXperience pour faire face aux menaces d'obsolesce...
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 
Php seance1
Php seance1Php seance1
Php seance1
 
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
 
gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquence
 
Retour d'expérience sur PowerShell
Retour d'expérience sur PowerShellRetour d'expérience sur PowerShell
Retour d'expérience sur PowerShell
 
cours developpement web javascript 2023/2024
cours developpement web javascript 2023/2024cours developpement web javascript 2023/2024
cours developpement web javascript 2023/2024
 
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
 
Rouabhi algiers meetup
Rouabhi algiers meetupRouabhi algiers meetup
Rouabhi algiers meetup
 

Mehr von 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
 
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
 

Mehr von Ruau Mickael (17)

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 ?
 
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
 

Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux!

  • 1. Shaker technologies Javascript-IEEE754 version 1.1 IEEE754 Manipulation des nombres flottants : exemples avec Javascript
  • 2. Shaker technologies Javascript-IEEE754 version 1.1 Human talker Mickaël Ruau : ! • consultant en qualité logicielle (forges logicielles) • spécialiste de l’informatique médicale (norme DICOM) • formateur à l’AFPA d’Angers
  • 3. Shaker technologies Javascript-IEEE754 version 1.1 Références http://blog.oaxoa.com/2008/03/22/weird-math-aka-ieee-754- double-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
  • 4. Shaker technologies Javascript-IEEE754 version 1.1 Disclaimer 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!
  • 9. La minute nécessaire Shaker technologies Javascript-IEEE754 version 1.1
  • 10. Shaker technologies Javascript-IEEE754 version 1.1 Etonnant, non?! console.log(0.1+0.2); //0.30000000000000004
  • 11. Shaker technologies Javascript-IEEE754 version 1.1 Etonnant, non?! (suite) console.log(0.1*0.2); //0.020000000000000004
  • 12. Shaker technologies Javascript-IEEE754 version 1.1 Etonnant, non?! (re-suite) console.log(0.11/0.10); //1.0999999999999999
  • 13. Shaker technologies Javascript-IEEE754 version 1.1 Etonnant, non?! (fin) console.log(0.3 - 0.2 ); //0.09999999999999998
  • 14. Explication Shaker technologies Javascript-IEEE754 version 1.1
  • 15. Shaker technologies Javascript-IEEE754 version 1.1 La cancellation 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. (...) ! En particulier, la soustraction de deux nombres très proches provoque une grande perte de précision relative : on parle de « cancellation ».
  • 16. Shaker technologies Javascript-IEEE754 version 1.1 Pourquoi 0.1 n’est pas 0.1? 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 !
  • 17. Shaker technologies Javascript-IEEE754 version 1.1 Exemples de format de stockage ! ▪ 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.
  • 18. Shaker technologies Javascript-IEEE754 version 1.1 Personne ne coule? Vers l’infini et au-delà avec les flottants…
  • 19. Shaker technologies Javascript-IEEE754 version 1.1 Passé les bornes, y’a plus de limite! console.log(1.00000000000000009);// affiche 1 ! var n1 = 123456789012345672; console.log(n1); // affiche 123456789012345660 ! var n2 = 123456789012345673; console.log(n2); // affiche 123456789012345680
  • 20. Shaker technologies Javascript-IEEE754 version 1.1 Mini, mini, mini console.log(1.00000000000000009);// affiche 1 ! console.log(0.000000000000000000000000000000000000 00000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000 000001); // affiche 0
  • 21. Shaker technologies Javascript-IEEE754 version 1.1 " Il faut une infinie patience pour attendre toujours ce qui n'arrive jamais. " (PIERRE DAC) console.log(9999999999999999999999999999999999999 99999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999 9999999999999999999999999999999999999); //affiche Infinity
  • 22. Shaker technologies Javascript-IEEE754 version 1.1 " Il faut toujours prendre le maximum de risques avec le maximum de précautions. " Rudyard Kipling console.log(3+999999999999999); //affiche 1000000000000002 ! console.log(3+9999999999999999); //affiche 1000000000000004 ! console.log(3+99999999999999999); //affiche 100000000000000000 ! console.log(2+99999999999999999); //affiche 100000000000000000
  • 23. Explication Shaker technologies Javascript-IEEE754 version 1.1
  • 24. Shaker technologies Javascript-IEEE754 version 1.1 IEEE 754 overflow http://fr.wikipedia.org/wiki/Virgule_flottante La plage d'exposants est limitée : • « overflows » lorsque le résultat d'une opération est plus grand que la plus grande valeur représentable • « 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.
  • 25. Shaker technologies Javascript-IEEE754 version 1.1 Quelles solutions? photo : http://blog.megdesk.com/computer-engineer-barbie-revised/
  • 26. Shaker technologies Javascript-IEEE754 version 1.1 Number() = IEEE 64 bit 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 floating-point, use the global parseFloat() function. ! var num = parseFloat("3.5");
  • 27. Shaker technologies Javascript-IEEE754 version 1.1 https://github.com/dtrebbien/BigDecimal.js 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);
  • 30. Shaker technologies Javascript-IEEE754 version 1.1 @HeforShe Dedicated to Pauline, Stéphanie, Sylvie, Mum… ! With love and kisses. You girls rock in IT! ! Credits : Photo : http://violasong.com/2010/03/what-a-computer-engineer-looks-like ! https://computer-engineer-barbie.herokuapp.com Cette présentation constitue une parodie au sens de l’article L.122-5 du Code de la Propriété Intellectuelle. This non-commercial transformative work constitutes fair use under Section 107 of the U.S. copyright act. Use of copyrighted material is necessary for the purpose of criticism and education, the images are only at the resolution necessary for this purpose, and this remix is clearly marked to avoid confusion with the original.