Erreur de calcul ???

Résolu/Fermé
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023 - Modifié le 3 févr. 2019 à 13:09
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023 - 4 févr. 2019 à 10:26
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

NHenry Messages postés 15140 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 30 juin 2024 333
3 févr. 2019 à 13:25
C'est normal, c'est la représentation des nombre à virgule flottante qui fait cela.
yg_be Messages postés 22950 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 juillet 2024 1 485
3 févr. 2019 à 13:32
je dirais même représentation binaire.
0
Whismeril Messages postés 19087 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 12 juillet 2024 916
3 févr. 2019 à 14:09
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
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
3 févr. 2019 à 19:47
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
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 4 févr. 2019 à 09:32
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
4 févr. 2019 à 10:26
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