IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Python, de zéro


précédentsommairesuivant

XXV. La précision des nombres décimaux

La précision des nombres décimaux est un souci lié non pas au langage Python, mais à l’informatique dans son ensemble.

Ce souci est directement issu de la méthode employée par un processeur pour convertir un nombre décimal en binaire.

En effet, tout nombre décimal est découpé en sommes de fractions de 1/2n (n montant de façon naturelle). Ainsi 0.8125 est en fait converti en 1/21 + 1/22 + 1/24, ce qui donne 0.1101 en binaire.

Mais cette méthode ne fonctionne en réalité avec exactitude que sur très peu de nombres décimaux et donc pour beaucoup d’autres, leur fait perdre de la précision. Par exemple, 0.6 sera un tout petit peu plus grand que 1/21 + 1/24 + 1/25, mais un tout petit peu plus petit que 1/21 + 1/24 + 1/25 + 1/26 et un tout petit peu plus grand que 1/21 + 1/24 + 1/25 + 1/28 + 1/29, mais un tout petit peu plus petit que 1/21 + 1/24 + 1/25 + 1/28+ 1/29+ 1/210, etc. Et aucune somme de fractions de 1/2n (n entier) ne pourra tomber exactement sur 0.6.

Python peut arriver à compenser en général l’erreur d’imprécision à l’affichage.

 
Sélectionnez
1.
2.
>>> 0.6
0.6

Mais cela n’est pas garanti dans toutes les situations…

 
Sélectionnez
1.
2.
3.
4.
5.
>>> 0.6/3
0.19999999999999998
>>> 0.2*3
0.60000000000000001
>>>

… ce qui peut causer des soucis si la précision d’un nombre ou des calculs sur ce nombre est impérative au chiffre près (gestion de comptes bancaires par exemple).

Python possède cependant un module decimal offrant des outils de gestion et de manipulation des nombres décimaux avec une précision absolue. Le principe de ce module est de travailler le nombre décimal chiffre par chiffre, comme à l’école primaire. Ainsi 0.2*3 sera calculé chiffre par chiffre ('0', '.', '2') multiplié par '3' (avec la retenue si nécessaire, etc.).

 
Sélectionnez
1.
2.
3.
4.
5.
6.
>>> import decimal
>>> decimal.Decimal("0.6") / 3
Decimal('0.2')
>>> decimal.Decimal("0.2") * 3
Decimal('0.6')
>>>

Cela se paye toutefois en retour par un temps de calcul très important. Tout comme pour le principe d’incertitude de Heinsenberg, on ne peut pas avoir à la fois la précision et la vitesse.


précédentsommairesuivant

Copyright © 2022 Svear (svear@free.fr) Permission est accordée de copier, distribuer ou modifier ce document selon les termes de la « Licence de Documentation Libre GNU » (GNU Free Documentation License), version 1.1 ou toute version ultérieure publiée par la Free Software Foundation.