Menu

Erreur de calcul ???

Messages postés
5
Date d'inscription
dimanche 3 novembre 2013
Dernière intervention
4 février 2019
-
Bonjour,

Voici ce que je tape:
x=2
while x<2.6:
print(x) #avec l'indentation qui n'apparaît pas ici#
x=x+0.1

Et voici ce que j'obtiens:
2
2.1
2.2
2.3000000000000003
2.4000000000000004
2.5000000000000004

Au lieu de:
2
2.1
2.2
2.3
2.4
2.5

Quelqu'un peut-il m'expliquer ce mystère ?
Merci d'avance

Configuration: Windows / Chrome 71.0.3578.98
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
14386
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
20 février 2019
215
1
Merci
C'est normal, c'est la représentation des nombre à virgule flottante qui fait cela.

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 56243 internautes nous ont dit merci ce mois-ci

yg_be
Messages postés
7442
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
23 février 2019
439 -
je dirais même représentation binaire.
Commenter la réponse de NHenry
Messages postés
12783
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 février 2019
473
1
Merci
Salut, c'est l'application binaire de la virgule flottante en fait....

Mais ça n'explique pas à Nico_63.

Imaginons une calculatrice qui peut afficher 4 chiffres, la virgules et 1 chiffre pour la notation scientifique (xxxx * 10 puissance y).

Si tu fais 9999 + 1, elle va afficher 1,000 * 10^4
Si tu fais encore plus 1 même affichage
Si tu fais encore plus 1 même affichage
Si tu fais encore plus 1 même affichage
Si tu fais encore plus 1 même affichage
Si tu fais encore plus 1 même affichage
Si tu fais encore plus 1 (10 005) elle va peut-être arrondir à 1,001 * 10^4

On voit qu'en quelque sorte certains nombre "n'existent pas".
Et encore elle aurait pu afficher 10,00 * 10^3 et là encore plus de nombres "n'existent pas", c'est ce qu'on appelle la notation à virgule flottante. Les 4 chiffres sont la mantisse et la puissance est l'exposant

En informatique la capacité de stockage et limitée, alors que les nombres sont pas définition infinis. Il a donc été décider des stocker les nombres décimaux sous la forme de nombre à virgule flottante. L'informatique fonctionnant par de l'électronique, cela est calculé en binaire, et la représentation dispose d'un certain nombre de bits pour la mantisse, et d'un certain nombre de bits pour l'exposant. La répartition dépend si le type choisi est codé sur 8, 16, 32 ou 64 bits.
De fait tout nombre qui ne colle pas au calcul est représenté par un proche, et n'existe réellement pas pour l'ordinateur.

Plus d'info
https://fr.wikipedia.org/wiki/Virgule_flottante

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 56243 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
390
Date d'inscription
dimanche 7 février 2016
Dernière intervention
17 février 2019
60
1
Merci
On peut se demander dans le cas présent d'où y a-t-il des décimales en trop grande quantité. C'est le nombre 0.1 qui n'a qu'une décimale en base 10 et en a une infinité en base 2 (il existe des cas inverses par exemple 2/3 n'a qu'une décimale en base 3 où il s'écrit 0.2 alors qu'il en a une infinité en base 10, il vaut 0.66666666...). Le système ne peut garder que 53 chiffres binaires et une fois reconverti en base 10, le nombre le plus proche de 0.1 est 0.1000000000000000055511151231257827021181583404541015625

D'où la séquence qui s'est produite est :
2
2.100000000000000088817841970012523233890533447265625
2.20000000000000017763568394002504646778106689453125
2.300000000000000266453525910037569701671600341796875
2.4000000000000003552713678800500929355621337890625
2.500000000000000444089209850062616169452667236328125

Mais le print décide de n'afficher qu'un certain nombre de chiffres et arrondit à
2
2.1000000000000000
2.2000000000000002
2.3000000000000003
2.4000000000000004
2.5000000000000004

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 56243 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Dalfab
Messages postés
3320
Date d'inscription
jeudi 16 juin 2005
Dernière intervention
19 février 2019
1171
1
Merci
Bonjour,

Je vais compléter ces réponses en te parlant d'une solution.
Comme tu t'en doutes, il est des domaines où la moindre erreur de calcul, dût-elle se situer au 10ème chiffre après la virgule, peut avoir des conséquences désastreuses. Aéronautique, spatial, finance, etc.
Comment font-ils ?
Ils utilisent le type decimal, qui a été créé justement pour éviter les écueils du type float.
Pour plus d'informations, n'étant pas moi-même spécifiquement un développeur python, je t'invite à lire la documentation : https://docs.python.org/fr/2/library/decimal.html

Xavier

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 56243 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Reivax962
Messages postés
5
Date d'inscription
dimanche 3 novembre 2013
Dernière intervention
4 février 2019
0
Merci
Merci à tous pour vos réponses complémentaires et éclairantes (en particulier Dalfab).
Je note l'utilité du module décimal qui permet d'éviter ces erreurs.
Deux questions complémentaires cependant:
j'avais exécuté le premier exemple du tuto Python suivant (très bon site au passage pour se dégrossir en programmation Python quand on ne connaît absolument pas ce langage comme moi):

http://python.lycee.free.fr/exemples.html

_ Pourquoi le problème n'apparaît pas sur l'exemple alors qu'il n'utilise pas le type décimal ? (Reivax962)
_ Pourquoi le problème chez moi n'apparaît-il qu'à partir de 2.3 et non de 2.1 ? (Dalfab)

Merci encore
Nicolas
Commenter la réponse de Nico_63