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 :

2 valeurs identiques, 2 test d'égalités identiques, 2 résultats différents ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Par défaut [RESOLU] 2 valeurs identiques, 2 test d'égalités identiques, 2 résultats différents ?
    Bonjour à tous,


    bon j'ai un problème qui me tarode. En codant, je suis resté bloqué un long moment sur une égalité qui ne produisait pas le résultat attendue, et j'ai remarqué qu'en réécrivant cette même égalité exactement de la même manière, hors de ma boucle (valeurs absolument identiques), cela produisait un résultat différent.
    Je peux donc résoudre mon problème facilement, mais je voudrais comprendre pourquoi le résultat est différent ?

    Voilà mon code :
    ***Version 1
    Dans cette version, on NE RENTRE PAS dans la boucle selon l'ordi la condition du for est FAUSSE (en fait elle est vraie si on vérifie de tête).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int i = 0;
    int step = 0;
    for(; (float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f))>=0.1f ; step++);
    Output : step = 0;

    ***Version 2
    Dans cette version, on RENTRE dans la boucle selon l'ordi la condition de boucle est VRAIE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int i = 0;
    int step = 0;
    float conditionValeur = (float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f));
    for(; conditionValeur>=0.1f ; step++)
    {
       //réévaluation de "conditionValeur"
    }
    Output : step = 1;


    Je comprends pas du tout pourquoi.


    Quelqu'un aurait une idée ???


    Bonne soirée à tous.

  2. #2
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    A l'oeil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 0;
    int step = 0;
    for(; ((float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f)))>=0.1f ; step++);
    Essaye ça.

    Si ça marche, c'etait ton cast en float qui etait mal placé ....

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Chez moi tout marche avec ton code...
    Juste une correction (mais de taille):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i = 0;
    int step = 0;
    for(
      ;
      (float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f))>=0.1f ; 
      step++
    ) //;
    Pas de ; après le for.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Par défaut
    Re.


    merci de vos idées. Mais c'est pas ça.

    Pour la réécriture que tu propose Kujara, c'est pareil que ce que j'ai écrit.
    J'ai écrit : ((float)(X)) et tu me dis d'écrire : (float)(X).
    En fait j'avais mit une parenthèse englobante en trop. Mais bon avec toutes ces parenthèses on s'y perd.
    (J'ai quand même testé ton code en copiant collant, et effectivement y a le même pb que sur le mien).

    Et sinon Albenejean, si si le ";" est volontaire car je n'ai pas de scope {} dans mon for. Donc c'est un for qui se débrouille tout seul comme un grand :-)
    Par contre je comprends pas que mon code marche chez toi. En même temps vaut mieux que le pb ne soit que sur mon ordi.

    Au passage : je bosse sous Visual .NET 2003 et Win XP Pro.



    Quelqu'un a une autre idée ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    OK je viens de comprendre ce que tu ne comprends pas (ou du moins je crois avoir compris)........

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    using namespace std;
     
    int main()
    {
        {
            int i = 0;
            int step = 0;
            cout<<"Test = "<<((float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f))>=0.1f )<<"\n";
            for(; (float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f))>=0.1f ; step++);
            cout<<"step = "<<step<<"\n";
        }
        cout<<"----\n";
        {
            int i = 0;
            int step = 0;
            float conditionValeur = (float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f));
            cout<<"Test = "<<(conditionValeur>=0.1f)<<"\n";
            for(; conditionValeur>=0.1f ; step++)
            {
                conditionValeur = (float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f));
            }
            cout<<"step = "<<step<<"\n";
        }
    }
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Test = 1
    step = 1
    ----
    Test = 1
    step = 2
     
    Process returned 0 (0x0)   execution time : 0.015 s
    Press any key to continue.
    Comme tu peux le voir, tes 2 test sont identiques. Par contre
    Si par
    //réévaluation de "conditionValeur"
    tu recalcule simplement conditionValeur, step ne sera pas augmenter lors du premier passage dans la boucle.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Par défaut
    En fait pour être plus précis la méthode 2 je ne l'ai testé que parce que je ne comprenais pas pourquoi la 1 ne fonctionnait pas.
    Mais quand je test la méthode 2 je fais la réévaluation de la valeur avec step+1. Je l'ai pas précisé, pour pas encombrer.

    Donc pour être plus exacte voilà la méthode 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i = 0;
    int step = 0;
    
    float conditionValeur = (float)(powf(10.0f, -1.0f*((float)step+1.0f))*((float)i+1.0f));
    for(; conditionValeur>=0.1f ; step++)
        conditionValeur = (float)(powf(10.0f, -1.0f*((float)(step+1)+1.0f))*((float)i+1.0f));

    Par contre, je vais tester ton code sur mon ordi, on sait jamais...

Discussions similaires

  1. Mongo : test deux champs identiques
    Par Cibou dans le forum Doctrine2
    Réponses: 3
    Dernier message: 19/12/2014, 11h36
  2. Réponses: 4
    Dernier message: 08/05/2012, 10h58
  3. [PHP 5.2] Additionner les valeurs de 2 tableaux si clés identiques
    Par renaud26 dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2011, 19h41
  4. Test d'égalité des valeurs
    Par matt41fr dans le forum Mathématiques
    Réponses: 11
    Dernier message: 12/03/2009, 13h13
  5. Réponses: 5
    Dernier message: 04/01/2006, 19h34

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