[FF] Soustraction en Javascript

Le
Steph
Combien fait: 5,2 - 0,1 = ?
Niveau scolaire: CM1 non ?

Tapez:
javascript:5.2-0.1
dans la barre URL de FF

Mais que fait l'Éducation Nationale :) ?

--
Steph
Enlever l'.adressebidon.invalid pour m'écrire en privé
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #11080761
Le 29/09/2007 15:02, Steph a écrit :
Combien fait: 5,2 - 0,1 = ?
Niveau scolaire: CM1 non ?

Tapez:
javascript:5.2-0.1
dans la barre URL de FF

Mais que fait l'Éducation Nationale :) ?



Eh bien c'est normal. Il se trouve juste qu'I.E. affiche deux chiffres
significatifs de moins que Firefox, mais le résultat est faux chez l'un
comme chez l'autre.

javascript:5.2-0.1-5
0.100000000000001 (Internet Explorer)
0.10000000000000053 (Firefox)

Le « responsable » n'est pas le navigateur, mais la norme IEEE-754. Et
le « coupable » est le programmeur s'il a besoin de faire des calculs
sur des nombres décimaux à n chiffres après la virgule et qu'il ne les
transforme pas en entiers avant (en les multipliant par 10^n).
Steph
Le #11080741
Le 29/09/2007 15:19, Olivier Miakinen disait:
Eh bien c'est normal. Il se trouve juste qu'I.E. affiche deux chiffres
significatifs de moins que Firefox, mais le résultat est faux chez l'un
comme chez l'autre.



Bonjour Olivier, toujours fidèle au poste :)
Tu aurais pu mettre normal entre guillemets...

javascript:5.2-0.1-5
0.100000000000001 (Internet Explorer)
0.10000000000000053 (Firefox)

Le « responsable » n'est pas le navigateur, mais la norme IEEE-754. Et
le « coupable » est le programmeur s'il a besoin de faire des calculs
sur des nombres décimaux à n chiffres après la virgule et qu'il ne les
transforme pas en entiers avant (en les multipliant par 10^n).



Voilà. C'est la seule solution. J'étais tombé sur ces "bugs" il y a
quelques années (tain, déjà 8 ans :( ) lorsque, pour le fun, j'avais
tâté les fcts Math de JS.

Si ça peut aider des collégiens...
f(x)=ax²+bx+c http://www.lavillerose.com/calcul/index.htm (j'étudiais ça
en Seconde S, et maintenant ?)
Fraction: http://www.lavillerose.com/calcul/fraction.php3
Nbs 1er: http://www.lavillerose.com/calcul/premier.php3
(tiens je croyais que le .php3 avait été abandonné chez Online ???)

Bon WE à tous, avec grand soleil bleu, profitez ! :)

--
Steph
Enlever l'.adressebidon.invalid pour m'écrire en privé
Olivier Miakinen
Le #11080731
Le 30/09/2007 13:35, Steph me répondait :

Eh bien c'est normal. Il se trouve juste qu'I.E. affiche deux chiffres
significatifs de moins que Firefox, mais le résultat est faux chez l'un
comme chez l'autre.



Bonjour Olivier, toujours fidèle au poste :)



:-D

Tu aurais pu mettre normal entre guillemets...



Je ne vois pas pourquoi. Quel que soit le format choisi pour représenter
les nombres (format à nombre fini de bits fixé à l'avance), il est tout
à fait normal que seul un nombre fini de réels soient représentables,
or 0,1 et 5,2 n'en font pas partie dans le cas de IEEE 754 64 bits.

En revanche, les nombres 1 et 52 en font partie, de même que tous les
entiers compris entre -9007199254740992 et +9007199254740992. Ça fait
quand même pas mal de possibilités pour les calculs courants.

Cela, tous les programmeurs doivent en être conscients, et s'ils ont
besoin de faire des additions et soustractions qui tombent juste avec
des nombres décimaux à n chiffres après la virgule ils doivent savoir
qu'il faut qu'ils travaillent avec des nombres 10^n fois plus grands
(la virgule ne se rajoutant qu'au moment de l'affichage).

[...] J'étais tombé sur ces "bugs" il y a
quelques années (tain, déjà 8 ans :( ) lorsque, pour le fun, j'avais
tâté les fcts Math de JS.



Encore une fois, guillemets ou pas, gants de toilette ou pas, ce ne sont
pas des bugs : c'est juste une conséquence normale du fait mathématique
qu'un ensemble infini est plus grand qu'un ensemble fini. Il n'y a bug
que lorsqu'un programmeur oublie qu'il doit prendre ses précautions
avant de faire des calculs en nombres flottants.

Bon WE à tous, avec grand soleil bleu, profitez ! :)



Idem !
Vincent Lefevre
Le #11080721
Dans l'article Olivier Miakinen
Le « responsable » n'est pas le navigateur, mais la norme IEEE-754.



Enfin le Javascript y est aussi pour quelque chose. Le langage aurait
pu *aussi* proposer une arithmétique décimale (cf IEEE 854 et la
révision de la norme IEEE 754, a.k.a. IEEE754R). Java le fait
d'ailleurs, sauf que c'est en précision arbitraire (mais c'est
mieux).

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Olivier Miakinen
Le #11080711
Le 01/10/2007 03:06, Vincent Lefevre a écrit :

Le « responsable » n'est pas le navigateur, mais la norme IEEE-754.



Enfin le Javascript y est aussi pour quelque chose. Le langage aurait
pu *aussi* proposer une arithmétique décimale



Oui, c'est vrai. Mais c'est plus facile à faire dans un langage
fortement typé que dans un langage tel que JavaScript où les
conversions sont automatiques d'un type à un autre, selon les
besoins. Par exemple il n'existe pas non plus un type entier
distinct du type flottant.

(cf IEEE 854 et la révision de la norme IEEE 754, a.k.a. IEEE754R).



Merci pour les références, je chercherai pour ma culture personnelle.

Java le fait d'ailleurs, sauf que c'est en précision arbitraire (mais
c'est mieux).



Java est un langage fortement typé, aussi il est bien heureux qu'il
le fasse.
Publicité
Poster une réponse
Anonyme