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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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