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

GTK+ avec C & C++ Discussion :

problème comparaison unsigned_int_type et gdouble


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Par défaut problème comparaison unsigned_int_type et gdouble
    Re-salut!
    Ces derniers jours j'ai souvent besoin de vous...

    j'ai un problème avec une comparaison de gboolean et unsigned_int_type

    j'essaie de faire:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(var != giw_vslider_get_value(GIW_VSLIDER(w)){
    <div style="margin-left:40px">   printf("**VALUE %f \n",giw_vslider_get_value(GIW_VSLIDER(w)));
       printf("**aaaa %i \n",var);
       giw_vslider_set_value(GIW_VSLIDER(w), var);</div>}

    où var est unsigned_int_type et giw_vslider_get_value retourne gdouble.


    comme ça mon programme entre toujours dans la clause if!! j'ai aussi essayé de caster var avec (gdouble) mais ça ne change rien.


    avec les printf je peut contrôler mes valeurs par exemple il print:
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    **VALUE 1.000000 
    **aaaa 1 
    
    **VALUE 1.900000 
    **aaaa 2


    ça veut dire qu'il rentre dans les deux cas dans le if...

    J'ai alors essayé de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(var - giw_vslider_get_value(GIW_VSLIDER(w)) != 0){
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(var - giw_vslider_get_value(GIW_VSLIDER(w)) == 0){

    Dans le premier cas le if est vraie, dans le deuxième il est faux !

    Ça vaut dire que 1.00000 est différent de 1…

    Je peut faire comment alors pour comparer mes valeurs ??

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Essaie de caster var en gdouble déjà ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((gdouble)var == XXXX) {

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Par défaut
    j'ai aussi essayé de caster var avec (gdouble) mais ça ne change rien.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Les doubles/floats ne peuvent pas être stockés de manière exacte par l'ordinateur, donc en fonction de comment tu obtiens tes valeurs 1.0/2.0/..., il peut y avoir de petites erreurs d'arrondis, c'est peut être ça qui te pose pb là. Tu peux essayer d'afficher tes 2 variables et leur différence en utilisant %f dans ton printf et pas %i, ça devrait te permettre de vérifier si le pb vient bien de là.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Par défaut
    Dand ton cas, le plus simple sera de caster la fonction giw_vslider_get_value avec gint avant la comparaison et non l'inverse.

    Pour la comparaison des valeurs flottantes bien connue des calculs numériques, généralement, on ne le fait pas avec 0 mais avec une valeur epsilon (10**-9, ...10**-12, ...) selon la précision, l'arrangement des bits, l'architecture de la machine (32 bits, 64 bits, 128 bits, ...) comme notre ami Teuf l'a pertinemment souligné.

    Cordialement

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Par défaut
    Merci beaucoup our votres réponses!

    effectivement le problème vient de l'arrondi, finalment j'ai modifié mon programme et je n'ai plus besoin de cette comparaison, mais ça m'interesse quand même de trouver une solution.
    Je travail avec une machine 32 bits. Je peut donc faire comment pour vérifier que ma valeur est bien à 0?

    Si je la caste directement en int je croit que je vais perdre de l'information et il sera indiqué que la valeur est zéro quand effectivement elle a été tronquée.

    Je doit donc comprarer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (var*10**-12) - giw_vslider_get_value(GIW_VSLIDER(w)) == 0
    ??
    Ou je n'ai pas bien compri l'histoire de la valeur epsilon...

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

Discussions similaires

  1. Problème comparaison objets avec equals
    Par belkasmi dans le forum Langage
    Réponses: 8
    Dernier message: 01/08/2007, 17h39
  2. [Dates] Problème comparaison de dates
    Par Davboc dans le forum Langage
    Réponses: 2
    Dernier message: 23/08/2006, 12h23
  3. Réponses: 21
    Dernier message: 04/05/2006, 11h09
  4. [Dates] problème Comparaison dates
    Par gwen-al dans le forum Langage
    Réponses: 4
    Dernier message: 06/01/2006, 11h24
  5. problème comparaison de date VB
    Par af_airone dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 20/10/2005, 11h18

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