Problème de somme

loki9678 -  
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je dois faire un travail d'informatique en utilisant python. Cependant durant mon développement du code je suis tombé sur une erreur plutôt bizarre . Voici le bout de mon programme qui bug :

k=0.0
while k <= 10:
    print(k)
    k=k+0.1



Je souhaite donc vérifier si l'évolution de ma variable k se fait bien, donc en théorie je devrait obtenir 0.0, 0.1, 0.2,...,9.8, 9.9, 10.0
Cependant voici ce que j'obtient :

0.0
0.1
0.2
0.30000000000000004
.
.
.
1.4000000000000001
1.5000000000000002
.
.
.
2.500000000000001
2.600000000000001
.
.
.
4.699999999999999
4.799999999999999
4.899999999999999
4.999999999999998
5.099999999999998
5.1999999999999975
5.299999999999997
5.399999999999997
.
.
.
8.699999999999985
.
.
.
9.89999999999998
9.99999999999998


Très vite les valeurs ont des décimales qui apparaissent de nulles part et donc l'évolution de ma variable k est bizarre
Je ne suis pas habitué à utiliser python mais pour le coup je ne comprend pas d'où pourrait venir l'erreur
Si quelqu'un peut m'éclairer svp ca serait génial :)
Merci

3 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour
Je me demande si ca ne serait pas un souci (connu ?) des nombres floatant..
Peux tu tester comme ceci ?
k= (k*10+1)/10

0
loki9678
 
Je viens d'essayer comme cela et ça fonctionne très bien. Merci beaucoup.
L'idée c'est de toujours passer par un nombre entier d'abord et ensuite de diviser par 10 par exemple pour revenir sur un réel ?
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > loki9678
 
Oui
C'est un "bug" courant en programmation sur l'addition ou la soustraction de nombres de rype float.
Et donc Par 10 ou par 100 (selon le nombre de decimales désirées)
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
Python travaille en binaire, et 0.1 n'est donc pas exactement égal à ce que tu imagines, ce qui explique ce comportement.
Si tu veux travailler en décimal:
import decimal
ud=decimal.Decimal(1)/decimal.Decimal(10)
k=decimal.Decimal(0)
while k <= 10:
    print(k)
    k=k+ud
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour yg_be,

En executant
print(decimal.Decimal(1))


j'ai l'erreur: AttributeError: 'int' object has no attribute 'Decimal'
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
code complet?
tu n'aurais pas une variable qui s'appelle
decimal
?
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bien vu !

En fait j'avais copié ton code dans un fichier fourre-tout maths.py qui me sert à faire des tests ...

Sinon, ça n'est pas vraiment un bug, c'est simplement la représentation en interne des nombres décimaux
Par exemple, on ne fais jamais, avec des float :

if(a==b):

ou:
if(a>b):


J'utilise plutôt des petites fonctions du style:

TOL = 0.000001

def is_equal(v1,v2):
    ''' Checks if v1 == v2 '''

    if(abs(v1-v2) < TOL):
        return(True)
    else:
        return(False)
0