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 :

Affichage d'un double


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut Affichage d'un double
    Hello
    je réalise l'affichage d'une valeur de type double dans une boucle a
    interval régulier, calculée a partir de nombreuses autres variables de type float/double et int.
    Au début l'affichage se réalise correctement, mais
    au bout d'un moment, la valeur affichée devient:

    82.5
    83.58
    -1.#IND
    -1.#IND

    Quelqu'un connait-il la signification de cet affichage et à la suite de quelle type d'erreur il apparait?

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Affichage d'un double
    Citation Envoyé par vinzzzz
    je réalise l'affichage d'une valeur de type double dans une boucle a
    82.5
    83.58
    -1.#IND
    -1.#IND

    Quelqu'un connait-il la signification de cet affichage et à la suite de quelle type d'erreur il apparait?
    La valeur ne représente pas un flottant valide (Not a Number ou NaN). IND est peut être une francisation (INDéfini ou INDéterminé...)

    Ca sent le débordement de tableau ou la valeur non initialisé, ou le pointeiur fou...

    Bref, sans voir le code, ça va être dur d'en dire plus...

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    La fonction qui calcule la valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    double calcul_maj(s_param *params, double  mass, float subst_c, double uptk_rate) {
          double n = mass* (params->growth_rt / params->max_rdt) * subst_c ;  
          double d = (params->sat_cst) + subst_c ;  
          double result = uptk_rate*n/d ;
          return result ;
    }
    Les paramètres de la structure params sont tous de type float. Pas de tableau ni de pointeur sauf pour la structure params qui contient des valeurs correctement initialisées. J'ai vraiment aucune idée de ce qui peut se passer...

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    J'ai affiché l'intégralité des valeurs utilisées pour les calculs et voici ce que j'ai obtenu (affichage console):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    In calcul_maj: (((1176.96*(0.0205/0.444)*1)) / (0.00234+1))*1 = 54.2147
    (...)
    In calcul_maj: (((1178.13*(0.0205/0.444)*1)) / (0.00234+1))*1 = -1.#IND
    Ca m'inspire pas beaucoup... (au passage, mon printf utilise %g pour afficher les valeurs)

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Avec d'autres valeurs...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    In calcul_maj: (((131.761*(0.0205/0.444)*0.001)) / (0.00234+0.001))*1 = 1.82143
    In calcul_maj: (((131.761*(0.0205/0.444)*0.001)) / (0.00234+0.001))*1 = 1.82143
    In calcul_maj: (((131.798*(0.0205/0.444)*0.001)) / (0.00234+0.001))*1 = -1.#IND
    ...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vinzzzz
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <...>
          double result = uptk_rate*n/d ;
    <...>
    Ah oui, j'avais oublié çà. Je vois des divisions, pas de divisions par 0 ?

    d n'est jamais egal à 0 ? C'est testé ? Validé ?

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    d est toujours positif. Dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d = (params->sat_cst) + subst_c
    subst_c est toujours strictement positif c'est vérifié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Console:
     
    In calcul_maj: d = 1.00234
    (((1175.79*(0.0205/0.444)*1)) / (0.00234+1))*1 = 54.1609
     
    In calcul_maj: d = 1.00234
    (((1178.13*(0.0205/0.444)*1)) / (0.00234+1))*1 = -1.#IND

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    J'ai encore mieux, en utilisant pour mass une valeur constante, au bout d'un certain nombre d'itération j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Console:
     
    In calcul_maj: d = 1.00234
     (((1568.07*(0.0205/0.444)*1)) / (0.00234+1))*1 = 72.2304
     
    (...)
     
    In calcul_maj: d = 1.00234
     (((1568.07*(0.0205/0.444)*1)) / (0.00234+1))*1 = -1.#IND

  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Tu as une autre division dans ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double n = mass* (params->growth_rt / params->max_rdt) * subst_c ;
    Si tu es sûr de ton d, alors la division par 0 viendra sûrement de là...

    Jc

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    En fait toutes mes valeures sont strictement positives (on peut d'ailleur le voir dans les affichages du dessu), et dans ma fonction seul le paramètre "mass" est différent a chaque appel, c'est pourquoi j'ai testé l'appel de la fonction en envoyant une constante numérique dirèctement, sans succès (voir au dessu...).
    C'est vraiment bizard.

  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 vinzzzz
    En fait toutes mes valeures sont strictement positives (on peut d'ailleur le voir dans les affichages du dessu), et dans ma fonction seul le paramètre "mass" est différent a chaque appel, c'est pourquoi j'ai testé l'appel de la fonction en envoyant une constante numérique dirèctement, sans succès (voir au dessu...).
    C'est vraiment bizard.
    Tu peux poster un programme complet et minimal permettant de reproduire le problème?

  12. #12
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Je vais essayer mais ca va pas être facile jpense que j'aurai pas le temps avant demain.
    RDV demain donc.

Discussions similaires

  1. Affichage d'un Double dans une JTable
    Par Brice22 dans le forum Composants
    Réponses: 1
    Dernier message: 16/03/2009, 16h38
  2. Affichage des floats/doubles
    Par Zenol dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 11/11/2008, 23h15
  3. affichage d'un double dans un fichier
    Par mencaglia dans le forum C++
    Réponses: 3
    Dernier message: 20/09/2006, 17h18
  4. [VC 2005 Express] Simple : limiter l'affichage d'un double
    Par ben_ghost dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 31/07/2006, 17h43
  5. format d'affichage d'un double
    Par couturier dans le forum C++
    Réponses: 1
    Dernier message: 25/01/2006, 17h41

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