Erreur de calcul ???

Résolu
Nico_63 Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   -  
Nico_63 Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

5 réponses

NHenry Messages postés 15219 Date d'inscription   Statut Modérateur Dernière intervention   365
 
C'est normal, c'est la représentation des nombre à virgule flottante qui fait cela.
1
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
je dirais même représentation binaire.
0
Utilisateur anonyme
 
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
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101
 
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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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

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

Posez votre question
Nico_63 Messages postés 41 Date d'inscription   Statut Membre Dernière intervention  
 
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
0