Erreur de calcul ??? [Fermé]

Signaler
Messages postés
5
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
4 février 2019
-
Messages postés
5
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
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

5 réponses

Messages postés
14672
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 mai 2020
231
C'est normal, c'est la représentation des nombre à virgule flottante qui fait cela.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 85361 internautes nous ont dit merci ce mois-ci

Messages postés
11178
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 mai 2020
635
je dirais même représentation binaire.
Messages postés
14861
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
29 mai 2020
543
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
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 85361 internautes nous ont dit merci ce mois-ci

Messages postés
456
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
17 mai 2020
59
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
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 85361 internautes nous ont dit merci ce mois-ci

Messages postés
3599
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
16 avril 2020
952
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
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 85361 internautes nous ont dit merci ce mois-ci

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

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