Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[FF] Soustraction en Javascript

5 réponses
Avatar
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é

5 réponses

Avatar
Olivier Miakinen
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).
Avatar
Steph
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é
Avatar
Olivier Miakinen
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 !
Avatar
Vincent Lefevre
Dans l'article ,
Olivier Miakinen <om+ é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 (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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Avatar
Olivier Miakinen
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.