IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de gestion d'un indice dans une boucle while


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Bricoleur
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut Problème de gestion d'un indice dans une boucle while
    Bonjour,
    J'ai un souci avec le code suivant en python :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while i <= 1 :
          print(i)
          i=i+0.05

    Au lieu d'avoir une succession de nombres affichés de 0 à 1 de 0,05 en 0,05 j'ai après le troisième passage dans la boucle le nombre 0.15000000000000002 qui s'affiche au lieu de 0.15 simplement.
    Je n'arrive pas à m'expliquer ces erreurs de calcul.

    Merci beaucoup de vos réponses.
    Cordialement.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    Les flottants sont représentés par une valeur "approchée" en binaire et comme par défaut python affiche jusqu'à 17 chiffres après la virgule, cela peut expliquer cette erreur.

    Tu peux résoudre ton souci en disant à python qu tu ne veux que 2 nombres après la virgule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while i <= 1 :
          print(format(i,'.2f'))
          i=i+0.05

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Bricoleur
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut
    Bonjour disedorgue,

    Ce code permet effectivement d'afficher les bonnes valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while i <= 1 :
          print(format(i,'.2f'))
          i=i+0.05
    Mais cela ne résout pas le fond de mon problème finalement !
    Car, si je me mets en terme d'algorithmique, le dernier nombre à afficher devrait être 1 !
    Alors que ce bout de code me donne 0.95.

    Mais merci beaucoup pour cette réponse.

    Cordialement.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Prend la peine de lire le lien que wiztricks t'a indiqué.

    Tu y comprendra pourquoi le nombre 1 que tu crois être précis, n'est pas stocké avec exactitude dans ton ordinateur.
    Et donc ca expliquera aussi pourquoi ce code ne fournit pas le résultat voulu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while i <= 1 :
          print(format(i,'.2f'))
          i=i+0.05
    mais que celui-ci oui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while i <= 1+1e-8 :
          print(format(i,'.2f'))
          i=i+0.05

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Dans ton cas, l'imprécision est sur le float64, donc il suffit juste de checker sur du float16 ou float32:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while float16(i) <= 1 :
          print(format(i,'.2f'))
          i=i+0.05
    ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=float16(0)
    while float16(i) <= 1 :
          print(i)
          i=i+0.05

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par Dexta Voir le message
    Je n'arrive pas à m'expliquer ces erreurs de calcul.
    Ah la représentation des flottants en binaire.... Heureusement qu'il y a de bons tutos pour expliquer tout çà.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Bricoleur
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut
    Bonjour wiztricks ,

    Merci beaucoup pour cette réponse et ce lien au combien explicite. Il fallait penser représentation en binaire des décimaux ! Simplement

    Mon problème étant que la boucle s'arrête pour i=0.95 au lieu de i=1 comme attendu avec l’expression conditionnelle i<=1.
    Il vaudrait donc mieux travailler avec des entiers et faire les divisions qui vont bien pour l'affichage !

    Merci beaucoup pour vos réponses.

    Cordialement.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Bricoleur
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bricoleur

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut
    Bonjour à tous,
    Voici un petit bout de code qui me permet de corriger mon petit défaut et d'être cohérent par rapport à mes attentes au niveau de l'expression conditionnelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=0
    while i <= 100 :
    	print(i/100)
    	i=i+5
    Encore une fois merci beaucoup à tous.
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des erreurs dans une boucle While
    Par Gregory.M dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/08/2008, 20h57
  2. Problème .destroy() dans une boucle while !
    Par stuffy dans le forum Tkinter
    Réponses: 1
    Dernier message: 29/06/2008, 01h30
  3. problème de recordset dans une boucle while
    Par sebac dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/06/2007, 11h47
  4. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  5. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo