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 :

Detecter la "valeur" -1#IND00


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 35
    Points : 25
    Points
    25
    Par défaut Detecter la "valeur" -1#IND00
    Bonjour,

    J'ai un bug qui traine depuis des jours et pas moyen de le localiser, meme en reduisant les operations sur cette variable au strict minimum, elle finit par prendre la valeur -1#IND000 de facon totalement aleatoire.

    Cela semble venir le plus souvent d'une division par 0 (j'ai retire toutes les divisions mais ca n'a pas regle le probleme). Pouvoir mettre un breakpoint lorsque la variable prend cette valeur pourrait me permettre d'affiner ma recherche et donc de le localiser, mais comment faire cela? QUelle condition utilisee dans un condition-breakpoint pour le faire se declencher si la valeur de la variable devient indefinie???

    un genre de

    if (valeur == -1#IND00)
    stop!!

    Sinon au pire, une autre idee d'ou peut venir ce genre de bug??

    Merci du coup de main!

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    -1#IND000 (valeur '"indéterminée"), c'est le texte qui représente la valeur NaN (Not a Number). En C++, si x ne vaut pas NaN (si x contient "réellement" un nombre), alors l'expression x == x vaut toujours true. Si x vaut NaN, cette expression vaut false ce qui signifie que sa négation, qui peut s'écrire x != x, vaut true.

    Deux nombreux compilateurs sont accompagnés de la fonction isnan (C99) qui ne fait pas encore partie du standard C++ mais qui fera bientôt partie. En C, inclure <math.h> et en C++, inclure <cmath> et utiliser l'espace de noms std.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    En sus de ce qu'a dit melem, je me pose la question de savoir si ce n'est pas le résutat d'une division par 0...

    Le plus facile est donc peut-être de s'assurer, avant d'effectuer la division, de vérifier que le diviseur ne vaut pas 0 (un assert, peut être )

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Normalement non, une division par un 0 produit +/-INF, pas NAN, sauf si on divise un zéro par un zéro.

    Pour ce qui est de mettre un breakpoint quand une valeur est modifiée, c'est généralement possible avec un bon debugger, même si la façon d'y parvenir n'est pas forcément des plus simples.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 899
    Points : 219 808
    Points
    219 808
    Billets dans le blog
    125
    Par défaut
    Pour moi, la division par zero "plante" le programme.
    Le système envoie un signal exprès pour ça.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    On parle ici de division par 0 sur des flottants. Si le compilateur suit la norme IEEE754 (tous les compilateurs classiques la suivent), il peut lever un flag en cas de division par 0, mais il doit, à ce que j'ai compris, renvoyer selon le cas +inf, -inf ou nan.

    Et c'est bien ce que fait ce programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    	double value;
    	cin >> value;
    	cout << 1.0 / value << endl;
    	cout << -1.0 / value << endl;
    	cout << 0.0 / value << endl;
    }
    Si j'entre 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0
    1.#INF
    -1.#INF
    -1.#IND

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    On parle ici de division par 0 sur des flottants. Si le compilateur suit la norme IEEE754 (tous les compilateurs classiques la suivent),
    En general, les compilateurs accedent a ce que le hard permet facilement. Dependre des details d'IEEE754 (en particulier les subnormaux et les nan signalant), c'est a ce que j'ai compris relativement aleatoire (du moins Java a fait marche arriere parce que c'etait suffisemment souvent trop couteux a implementer).

    il peut lever un flag en cas de division par 0, mais il doit, à ce que j'ai compris, renvoyer selon le cas +inf, -inf ou nan.
    La notion d'exception d'IEEE 754 n'est pas mappee sur les exceptions du C++. Voir <fpenv.h>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0
    1.#INF
    -1.#INF
    -1.#IND
    Amusant. C99 demande [-]inf [-]infinity [-]nan [-]nann-char-sequence (autrement dit chiffres, lettres ascii et _)

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