Multiplication no correcte

Le
888.marc
Bonjour,

Depuis la ligne de commande de Python25 je saisis:
>>> 29.7*3
Résultat:
89.099999999999994 . au lieu de 89.1

Quelqu'un peut-il m'expliquer pourquoi la multiplication n'est pas
juste?
Merci
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
Bruno Piguet
Le #17848451
a écrit :
Bonjour,

Depuis la ligne de commande de Python25 je saisis:
29.7*3






Résultat:
89.099999999999994 .... au lieu de 89.1

Quelqu'un peut-il m'expliquer pourquoi la multiplication n'est pas
juste?



Je ne peux pas.
Tout simplement parce que cette multiplication est parfaitement juste
... dans le cadre de l'arithmétique en virgule flottante, qui est celle
de nos microprocesseurs, et donc celle qu'on retrouve par défaut dans
les langages de programmation.
La solution à votre question est donc, soit dans un arrondi, soit
dans l'utilisation de bibliothèques de calcul en précision arbitraire.

Un point de départ pour les explications :
http://wikipython.flibuste.net/CalculerJuste

De façon plus générale, l'arithmétique a virgule flottante est un
domaine étrange, où l'on manipule des choses qui *ressemblent* aux
nombres que l'on a croisé en math depuis le primaire... mais qui n'en
ont pas toutes les propriété usuelles.
Pour creuser, une simple recherche google donne :
http://perso.ens-lyon.fr/jean-michel.muller/CoursVF-4p.pdf
et, en plus dense :
hal.archives-ouvertes.fr/docs/00/07/14/77/PDF/RR-5105.pdf
ou
http://www.ens-lyon.fr/LIP/Pub/Rapports/PhD/PhD2004/PhD2004-05.pdf

Bon courage.

Bruno.
Méta-MCI \(MVP\)
Le #17848971
Bonjour !

Ce comportement est conforme à la norme IEEE-754, qui décrit
l'utilisation des nombres en virgule flottante dans les ordinateurs.
Voir : http://fr.wikipedia.org/wiki/Nombre_flottant

Néanmoins, je signale qu'il existe, dans Python, une alternative. Voir
le module "decimal", dans l'aide/la doc.
(en ligne : http://docs.python.org/library/decimal.html).

Et aussi, pour Bruno Piguet, les microprocesseurs intègrent tous une
autre arithmétique, le Décimal-Codé-Binaire (DCB), qui n'a pas ces
problèmes d'arrondis. Malheureusement, le lobbying hégémonique des
scientifiques, relativement aux comptables, a rendu son utilisation
marginale.

@-salutations

Michel Claveau
Bruno Piguet
Le #17850121
Méta-MCI (MVP) a écrit :

Et aussi, pour Bruno Piguet, les microprocesseurs intègrent tous une
autre arithmétique, le Décimal-Codé-Binaire (DCB), qui n'a pas ces
problèmes d'arrondis. Malheureusement, le lobbying hégémonique des
scientifiques, relativement aux comptables, a rendu son utilisation
marginale.



Il est vrai que, trempant plutôt dans le premier monde que dans le
second, j'avais oublié le DCB.
Mais je ne crois pas qu'il faille opposer binairement le DCB et la
virgule flottante : William Kahan, le père de la norme IEEE754,
travaillait chez HP, et, si je me souviens bien (25 ans, déjà), les
calculatrices HP (au moins la 15 et la 41) stockaient leurs nombres sous
la forme mantisse+exposant, mais en base 10, avec les chiffres codés en BCD.

Bruno.
Bruno Piguet
Le #17850111
Méta-MCI (MVP) a écrit :

Et aussi, pour Bruno Piguet, les microprocesseurs intègrent tous une
autre arithmétique, le Décimal-Codé-Binaire (DCB), qui n'a pas ces
problèmes d'arrondis. Malheureusement, le lobbying hégémonique des
scientifiques, relativement aux comptables, a rendu son utilisation
marginale.



Il est vrai que, trempant plutôt dans le premier monde que dans le
second, j'avais oublié le DCB.
Mais je ne crois pas qu'il faille opposer binairement le DCB et la
virgule flottante : William Kahan, le père de la norme IEEE754,
travaillait chez HP, et, si je me souviens bien (25 ans, déjà), les
calculatrices HP (au moins la 15 et la 41) stockaient leurs nombres sous
la forme mantisse+exposant, mais en base 10, avec les chiffres codés en BCD.

Bruno.
Méta-MCI \(MVP\)
Le #17853381
'soir !

La meilleure preuve que le DCB (BCD en anglais) aurait dû être
prioritaire, c'est que, chez ceux qui ont fait différemment, cela
provoque des tremblements, et des émissions de messages en double...

;o)

--
Michel Claveau
888.marc
Le #17868531
Merci Bruno Piguet et Michel Claveau pour vos explications
rassurantes :-)

Marc
Publicité
Poster une réponse
Anonyme