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 :

Comparaison de doubles


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Comparaison de doubles
    Bonjour,

    Pour comparer des réels, j'utilise le code présent dans la FAQ, or j'ai un problème concernant la comparaison de nombres de signes différents. En effet, le code me retourne toujours "0". J'ai bien des solutions pour contourner ce problème, mais je souhaitais savoir si ce n'était pas plutôt une erreur de ma part, notamment avec les valeurs d'epsilon ?

    Ci-dessous un exemple de code qui me retourne le 0 alors que cela doit être -1

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    int dbl_cmp(double x, double y, double eps_a, double eps_r)
    {
        double a, b;
        int ret;
     
        /* On tente tout d'abord une comparaison bit a bit. */
     
        if (x < y)
        {
            a = x;
            b = y;
            ret = -1;
        }
        else if (x > y)
        {
            a = y;
            b = x;
            ret = 1;
        }
        else
            ret = 0;
     
        /* Si x != y, on tente alors une comparaison avec tolerance a l'erreur. */
     
        if (ret != 0)
        {
            /* Si eps_a != 0, l'utiliser. */
     
            if (b - a < eps_a)
            {
                ret = 0;
            }
     
            if (ret != 0)
            {
                /* Si on a encore ret != 0 (i.e. x != y), utiliser eps_r. */
     
                if ((b - a) / a < eps_r)
                    ret = 0;
            }
        }
        return ret;
    }
     
    int main ( int argc, char *argv[] )
    {
        double a = -3.50;
        double b = 2.250;
     
        printf("%f %f : %d\n", a, b, dbl_cmp(a,b, 0.001, 0.001));
        return EXIT_SUCCESS;
    }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    oui, il y a une erreur, lorsque tu utilise eps_r (la variation relative maximale pour l'égalité), tu as une erreur de signe.
    puisque a = -3.50 et b = 2.250, tu as b-a positif, donc (b-a)/a négatif, donc inférieur à eps_r.
    Il faut rajouter une valeur absolue (fabs) en ligne 39

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    S'il y a une erreur dans une entrée de la FAQ, il faut regarder si elle est déjà décrite dans ce sujet. Si ce n'est pas le cas, il faut répondre dans ce sujet pour la signaler.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il y a bien une erreur, je la notifie là-bas.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le code est à l'évidence vérolé : il suffit d'avoir pour valeurs 0 et un nombre positif pour qu'il plante sur une division par 0.
    En plus les commentaires sont faux ( /* Si eps_a != 0, l'utiliser. */ )

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Citation Envoyé par diogene Voir le message
    Le code est à l'évidence vérolé : il suffit d'avoir pour valeurs 0 et un nombre positif pour qu'il plante sur une division par 0.
    En plus les commentaires sont faux ( /* Si eps_a != 0, l'utiliser. */ )
    Pas vérolé, ce n'est pas un virus, mais erroné, ou faux

Discussions similaires

  1. Ergotage sur la comparaison de doubles
    Par gangsoleil dans le forum C
    Réponses: 16
    Dernier message: 26/01/2015, 17h11
  2. switch sur comparaison de double
    Par lovedesitaliens dans le forum C#
    Réponses: 1
    Dernier message: 14/10/2010, 16h25
  3. comparaison de doubles, valeur absolue et perf
    Par ppaul128 dans le forum C++
    Réponses: 10
    Dernier message: 19/05/2008, 14h14
  4. Comparaison de double
    Par bolhrak dans le forum C++
    Réponses: 9
    Dernier message: 17/02/2008, 19h20
  5. Réponses: 4
    Dernier message: 05/07/2004, 13h17

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