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 :

tester si un double se termine par .00000


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Par défaut tester si un double se termine par .00000
    Salut,

    je voudrais tester dans une condition si un double contient des chiffres après la virgule. Je voudrais donc une condition du style : true si mon double casté en int garde la même valeur.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    static_cast -> int. Tu testes ensute si le delta est inférieur à un certain seuil en valeur absolue.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Hmm, je ne vois pas d'autres moyens que de décomposer ton double puis de déterminer si c'est un entier en fonction de certains tests sur ses composantes.
    Mais faire ça de manière portable, c'est difficile.

    Après tu peux toujours passer par la représentation décimale.
    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
    #include <iostream>
    #include <sstream>
     
    int main()
    {
        double d = 5.2;
        int i;
        std::stringstream ss;
        ss << d;
        if(ss >> i && ss.peek() == EOF)
        {
            std::cout << "C'est un entier : " << i << std::endl;
        }
        else
        {
            std::cout << "Ce n'est pas un entier" << std::endl;
        }
    }

  4. #4
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Salut,

    En fait, ça dépend de ce que tu veux savoir.

    S'il s'agit de savoir si ton double "mériterait" d'être entier, il me semble que tu peux te contenter de le static_caster, et de le comparer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::numeric_limits<double>::epsilon();
    Mais ce n'est peut-être pas ça ton problème. Si, par exemple, tu veux savoir si son affichage via une istringstream serait à virgule, le test précédent ne donnera pas forcément le bon résultat.

    Pour preuve, le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        double d = 9.9999999;
        std::cout << d << std::endl;
        std::cout << (d - static_cast<double>(static_cast<int>(d)) < std::numeric_limits<double>::epsilon()?"C'est entier":"Ca n'est pas entier") << std::endl;
    Affiche
    10
    Ca n'est pas entier

  5. #5
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    C'est pas plus simple de faire comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double d = 92.02
    if ((double)(int)d == d)
      cout << "c'est un entier" << endl;
    else
      cout << "c'est pas un entier" << endl;
    Désolé si ça parait débutant, mais pourquoi utiliser des écritures compliquées avec les statinc int et cast? Une autre particularité du C++?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Désolé si ça parait débutant, mais pourquoi utiliser des écritures compliquées avec les statinc int et cast? Une autre particularité du C++?
    Casts : http://c.developpez.com/faq/cpp/?pag...s#DIVERS_casts

    Comparaison de flottants : http://c.developpez.com/faq/cpp/?pag...ions_flottants

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Laurent Gomila
    Cette FAQ a le problème qu'elle contribue à faire croire que numeric_limits::epsilon peut être utilisé tel quel dans ce genre de circonstance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abs(a-b) <= err*max(abs(a), abs(b))*numeric_limit::epsilon
    où err est choisi en fonction de l'erreur autorisée.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par coyotte507
    C'est pas plus simple de faire comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double d = 92.02
    if ((double)(int)d == d)
      cout << "c'est un entier" << endl;
    else
      cout << "c'est pas un entier" << endl;
    Désolé si ça parait débutant, mais pourquoi utiliser des écritures compliquées avec les statinc int et cast? Une autre particularité du C++?
    Pour les casts, voir la réponse de Laurent.

    A noter qu'il y a un problème quand les flottants se mettent à dépasser ce qui est représentable dans un int.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Feriaman
    Salut,

    En fait, ça dépend de ce que tu veux savoir.

    S'il s'agit de savoir si ton double "mériterait" d'être entier, il me semble que tu peux te contenter de le static_caster, et de le comparer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::numeric_limits<double>::epsilon();
    Mais ce n'est peut-être pas ça ton problème. Si, par exemple, tu veux savoir si son affichage via une istringstream serait à virgule, le test précédent ne donnera pas forcément le bon résultat.

    Pour preuve, le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        double d = 9.9999999;
        std::cout << d << std::endl;
        std::cout << (d - static_cast<double>(static_cast<int>(d)) < std::numeric_limits<double>::epsilon()?"C'est entier":"Ca n'est pas entier") << std::endl;
    Affiche
    epsilon ne s'utilise pas comme cela. Il indique la différence entre le nombre représentable le plus proche supérieur à 1 et 1. Les flottants ayant une précision relative relativement constante, ta méthode a un problème pour les nombres plus grand que 2 -- où elle ne va jamais retourner que c'est un entier -- et pour les nombres plus petits que 0.5 où elle va retourner que c'est parfois un entier quand ce n'est pas le cas.

  10. #10
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    epsilon ne s'utilise pas comme cela.
    En effet, je dois admettre que c'est une erreur de ma part.
    Toutes mes excuses pour ce code qui est faux.

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par gletare
    Salut,

    je voudrais tester dans une condition si un double contient des chiffres après la virgule. Je voudrais donc une condition du style : true si mon double casté en int garde la même valeur.

    Merci d'avance
    me semble être la solution la plus robuste avec d qui est dans une variable.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/05/2010, 21h48
  2. Réponses: 7
    Dernier message: 15/06/2007, 18h50
  3. Réponses: 7
    Dernier message: 24/08/2006, 12h21
  4. Select qui boucle ou se termine par un Ora-01460
    Par PatriceP dans le forum Oracle
    Réponses: 4
    Dernier message: 29/10/2004, 08h53
  5. Réponses: 10
    Dernier message: 18/11/2003, 18h01

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