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

C++ Discussion :

truc bizarre dans une boucle


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut truc bizarre dans une boucle
    Voici le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main(){
       double min_ws=1;
        double ws,dws=exp(0.1);
      for (ws = min_ws; ws <= min_ws*dws;ws*=dws)
        {cout<<ws<<",";
    }}
    il est tout a fait normal qu'il me renvoie 1,1.10517, puisque j'initialise a min_ws, puis je parcours la boucle jusqu'a min_ws*dws en incrémentant ws de dws.

    Par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main(){
       double min_ws=1;
        double ws,dws=exp(0.1);
      for (ws = min_ws; ws <= min_ws*dws*dws ;ws*=dws)
        {cout<<ws<<",";
    }}
    renvoie la meme chose, alors que j'ai repoussé la limite a min_ws*dws*dws au lieu de min_ws*dws

    Enfin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main(){
       double min_ws=1;
        double ws,dws=exp(0.1);
      for (ws = min_ws; ws <= min_ws*dws*dws*dws ;ws*=dws)
        {cout<<ws<<",";
    }}
    Il me renvoie 4 nombres, ce qui est correcte. En gros il y a un problème au deuxieme programme
    JE ne vois pas du tout d'ou vient l'erreur???
    J'avoue etre perdu la!!!
    merci de m'aider.

  2. #2
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    en rajoutant à la fin du deuxième code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout<<endl<<ws<<" "<<min_ws*dws*dws<<" "<<ws-min_ws*dws*dws;
    ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ ./a.exe 
    1.2214
    1,1.10517,
    1.2214 1.2214 4.91144e-017
    donc le fait qu'il s'arrête est tout à fait normal,

    pour régler le problème, je te conseille soit d'utiliser des entiers pour tes indices de boucle (en tout cas on m'a toujours déconseillé de faire le contraire)
    soit de comparer la valeur absolue de l'écart à un epsilon comme fait pour savoir si une valeur est nulle

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ok, j'ai vu.
    mais pourquoi bug til à la deuxieme boucle, alors qu'il bug pas dans les autres?

  4. #4
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    parce que pour la deuxième boucle de delta est "légèrement positif" alors que dans les autres cas le delta "légèrement négatif"
    donc en gros tu as une chance sur deux que le dernier test soit bon parce que les deux valeurs sont très proches

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    un truc comme ca serait il bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(){
       double min_ws=1,ws;
        double i,dws=exp(0.1);
     i=0;
     ws=min_ws;
      for (i=1; i <= 18;i++) {
     
          cout<<ws<<"'";
     
          ws=ws*dws;
    }  }

  6. #6
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    tout a fait parce que car tu utilises un entier comme indice de boucle
    donc la il n'y aura pas de problème avec un delta infiniment petit

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par cboudy
    tout a fait parce que car tu utilises un entier comme indice de boucle
    donc la il n'y aura pas de problème avec un delta infiniment petit
    ?? alors que le code donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(){
       double min_ws=1,ws;
        double i,dws=exp(0.1);
     i=0;
     ws=min_ws;
      for (i=1; i <= 18;i++) {
     
          cout<<ws<<"'";
     
          ws=ws*dws;
    }  }
    S'il est utilisé comme un entier, pourquoi ne pas l'avoir défini comme int ?

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    c'est vrai, mais changer le type de double en int ne doit pas changer grand chose.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par deubelte
    c'est vrai, mais changer le type de double en int ne doit pas changer grand chose.
    Ça assure qu'il n'y aura pas d'approximation lors du +1.

    Il faut toujours faire attention quand on utilise des nombres réels.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par deubelte
    c'est vrai, mais changer le type de double en int ne doit pas changer grand chose.
    Tu peux avoir des écarts de calculs carrément non négligeables. Surtout sur des plate-formes où les ints sont 64 bits.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    j'avais pas fais attention , effectivement il vaut mieux déclarer i en tant que integer pour éviter les approximations

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

Discussions similaires

  1. [AC-2003] petit truc simple a part pour moi (concaténation dans une boucle)
    Par b.billet85 dans le forum VBA Access
    Réponses: 7
    Dernier message: 04/08/2010, 13h04
  2. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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