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
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    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 confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    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
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    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 confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    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
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    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 confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    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 éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    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 ?
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

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

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    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.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  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 : 49
    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
    Points : 16 213
    Points
    16 213
    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 confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    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