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 :

[Valeurs réelles] détecter une valeur #IND ou #NAN


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Par défaut [Valeurs réelles] détecter une valeur #IND ou #NAN
    Salut à tous,

    Lorsque j'utilise des algorithmes linéaires de résolution de systèmes d'équation linéaires (genre Gradient Conjugué), il arrive que les valeurs tendent vers l'infini .

    Je voudrais donc pouvoir "détecter" si une valeur réelle de type double ou float est "valide" (c'est à dire pas #IND ou #NAN) pour lancer des exceptions dans le cas contraire. Existe-t-il un moyen ?

    Merci d'avance !

    L.S.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    il y as isnan(double x) et finite(double x)

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Pour NaN (ou IND qui est je crois un 'quiet' NaN chez Microsoft) une solution simple (et je pense portable) est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        if( value != value )
            ;
    Fascinant hein ?

    Sinon pour les nombres infinis il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if( value == std::numeric_limits< float >::infinity() )
            ;
        if( value == - std::numeric_limits< float >::infinity() )
            ;
    Si c'est vraiment des cas d'infinis obtenus par division par zéro je pense qu'il s'agit plutôt des seconds.

    edit : typo malheureuse, il fallait lire 'quiet NaN' et non 'quite NaN'

    MAT.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Par défaut
    Ok sympa, je vais essayer tout ça .

    Merci A+

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Je voudrai pas dire de bétise, mais il me semble bien qu'une exception est levée lors d'une division par 0.
    Ce qui se traduit par un 'crash' du programme

    Me gourre-je ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par nicroman
    une exception est levée lors d'une division par 0
    C'est en C que ça plante fourbement, non ?
    En tous cas le code suivant est tout à fait valide et ne lève pas d'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BOOST_AUTO_TEST_CASE( DivideByZeroEqualsInfinity )
    {
        const float zero = 0.f;
        BOOST_CHECK_EQUAL( std::numeric_limits< float >::infinity(), 1.f / zero );
    }
    Bon là ça produit un warning sous vc80 et si on met 1.f / 0.f c'est carrément une erreur

    MAT.

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

Discussions similaires

  1. [Toutes versions] Détecter changement valeur retournée par une formule
    Par Jean-Philippe André dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/08/2012, 09h17
  2. tester une valeur et affecter une valeur
    Par Elise0251 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 29/07/2009, 16h31
  3. Réponses: 10
    Dernier message: 30/11/2006, 23h06
  4. Réponses: 3
    Dernier message: 22/01/2005, 22h06
  5. Affcecter une valeur NULL dans une requete paramétrée
    Par thiouwz2 dans le forum Bases de données
    Réponses: 7
    Dernier message: 05/11/2004, 15h02

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