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 :

Probleme avec NaN et -Inf


Sujet :

C

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut Probleme avec NaN et -Inf
    Bonsoir à tous,
    J'ai un probleme avec ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    double info_mut(ChainonMot const *pc, ChainonMot const *pc2,int nblignes)
    {
     double  IM=0;
     
     
       IM=((nbrLignesCommunes(pc,pc2)/nblignes)*log2((nbrLignesCommunes(pc,pc2)/nblignes)/(nombreLigne(pc)*nombreLigne(pc2))));
    printf("%lf",IM);
    //printf("%d",(nombreLigne(pc)*nombreLigne(pc2)));
        return  IM;
    }
    LE compilateur m'affiche NAN au lieu d'une certaine valeur numérique.
    J'ai pensé à ce qu'il ya un souci de division par zéro, mais j'ai bien verifié que nombreLigne(pc)*nombreLigne(pc2) est différetnte de 0
    ce que je trouve que bizarre
    Une idée à cela svp?
    Merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    A mon avis, le problème vient du terme (nbrLignesCommunes(pc,pc2)/nblignes) qui doit être nul => 0/0 => NaN

    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
    >> log2(0)
     
    ans =
     
      -Inf
     
    >> log2(0)/0
     
    ans =
     
      -Inf
     
    >> 0*log2(0)/0
     
    ans =
     
       NaN
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Dut,
    aussi je vois qu'il ya un probleme à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbrLignesCommunes(pc,pc2)/nblignes
    qui m'affiche égal à 0.000000
    or quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%i",nbrLignesCommunes(pc,pc2)), il m'affiche 3
    et nblignes = 2
    donc normallement ca vaut 0.5 et non pas 0.00000
    Le jour est le père du labeur et la nuit est la mère des pensées.

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par cyrine Voir le message
    Merci Dut,
    aussi je vois qu'il ya un probleme à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbrLignesCommunes(pc,pc2)/nblignes
    qui m'affiche égal à 0.000000
    or quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%i",nbrLignesCommunes(pc,pc2)), il m'affiche 3
    et nblignes = 2
    donc normallement ca vaut 0.5 et non pas 0.00000
    C'est parce que tu fais une division d'entier et non une division de reel.
    Cela veut dire que nbrLignesCommunes(pc,pc2) et nblignes sont des int.
    Fais un simple cast pour avoir une division comme tu le souhaite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((double) nbrLignesCommunes(pc,pc2))/nblignes

  5. #5
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci SofEvans,
    mais même si je modifie la formule de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double info_mut(ChainonMot const *pc, ChainonMot const *pc2,int nblignes)
    {
     double  IM=0;
     
    IM= (double)log2(nbrLignesCommunes(pc,pc2)/nblignes);
    printf("%d  \n",IM);
     
        return  IM;
    }
    j'obtiens une valeur =0 au lieu de 0.6
    Le jour est le père du labeur et la nuit est la mère des pensées.

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Mauvais cast.

    Si on regarde ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IM= (double)log2(nbrLignesCommunes(pc,pc2)/nblignes);
    on a ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (double)       log2(nbrLignesCommunes(pc,pc2)/nblignes)
    Ce qui revient implicitement a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (double)    (   log2(nbrLignesCommunes(pc,pc2)/nblignes)   )
    En resumé, tu demande au resultat de la division entiere de devenr un double.
    Donc 0 deviendra 0.000, ce qui n'arrange pas l'affaire

    Tu dois forcer le type en double sur une des deux composante de ta division.
    On obtient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IM= log2( ((double)nbrLignesCommunes(pc,pc2))/nblignes);
    ou ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IM= log2(nbrLignesCommunes(pc,pc2)/((double)nblignes);

  7. #7
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    et avec cette nouvelle formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IM=((double)nbrLignesCommunes(pc,pc2) /nblignes)*log2(double)((nbrLignesCommunes(pc,pc2) /nblignes)/((nombreLigne(pc))*nombreLigne(pc2)));
    il maffiche une errreeur
    : expected expression before ‘double’|
    Une idée?
    Le jour est le père du labeur et la nuit est la mère des pensées.

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Un petit problème de parenthèse :

    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    MErci Dut,
    MAis le probleme de -INF persiste encore avec cette formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IM=((double)nbrLignesCommunes(pc,pc2) /nblignes)*log2((double)((nbrLignesCommunes(pc,pc2) /nblignes)/((nombreLigne(pc))*nombreLigne(pc2))));
    et le problème c'est que je suis sure que la valeur de nblignes est >0, donc d'où est ce que vient ce probleme de division par 0
    Le jour est le père du labeur et la nuit est la mère des pensées.

  10. #10
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Il y a deux division.

    A ce stade, je te conseille de faire un printf de tout tes parametre pour eventuellement voir qui pourrait deranger. Sinon, le mieux serait de refaire la formule pas a pas, en parenthesant petit a petit pour eviter de coder la mauvaise formule.

  11. #11
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    voilà je décortique ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double  probabilit(ChainonMot const *pc, ChainonMot const *pc2,int nblignes)
    {
        double  p=0;
        p=nbrLignesCommunes(pc,pc2)/nblignes;
        return p;
    }
    quand j'affiche la valeur de nbrLignesCommunes(pc,pc2) il m'affiche 2
    aussi pour nblignes=3
    donc il doit m'afficher 0.6666666
    or là il m'affiche 0.0000000
    Le jour est le père du labeur et la nuit est la mère des pensées.

  12. #12
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Comme dit depuis toujours, tu fais une division d'entier !

    Quant tu fais :

    p=nbrLignesCommunes(pc,pc2)/nblignes;


    En realite, p prend le nombre de fois que nbrLignesCommunes(pc,pc2) contient nblignes.

    Plus explicitement, combien de fois 2 peut contenir 3 ? reponse : 0

    Il est tout a fait normal que p, meme s'il est de type double prenne 0 et non 0.6666.

    Pour resoudre ce probleme, meme conseil, meme remarque : caster un de deux membre de la division afin que la division soit une division de reel. Tu aura le resultat escompté.

  13. #13
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Suite a MP avec cyrine, voici la formule :

    IM(x,y)= probabilité (x,y)*LOG2(probabilité (x,y)/(probabilité(x )*probabilité(y )))
    Si nous reprenons comme cela :





    probabilité (x,y) -> obtenu grace a "nbrLignesCommunes(pc,pc2)/nblignes " (type INT)
    probabilité(x) -> obtenue grace à nombreLigne(pc) (type INT)
    probabilité(y) -> obtenue grace à nombreLigne(pc2) (type INT)

    IM -> resultat (type DOUBLE)



    Si nous reprenons calmement. ON va commencer par faire le log2

    LOG2(probabilité (x,y)/(probabilité(x )*probabilité(y )))
    reviendrait à
    log2( (nbrLignesCommunes(pc,pc2)/nblignes) / (nombreLigne(pc)*nombreLigne(pc2)))

    Seul probleme, les type :

    log2((INT/INT)/(INT*INT)).
    Ce qui peut s'ecrire :
    log2(INT/INT)
    Cela fait donc une division d'entier qui donne .... un INT. On a donc :

    log2(INT)
    Or, log2 n'est pas prevu pour avoir un INT, il fait donc une conversion implicite. De plus, tu perd de la precision. Il faut donc caster :

    log2( (nbrLignesCommunes(pc,pc2)/((double)nblignes)) / (nombreLigne(pc)*nombreLigne(pc2)))


    On a donc :
    log2 ((INT/DOUBLE)/(INT*INT))
    log2 (DOUBLE/INT)
    log2 (DOUBLE)

    On a donc ceci, et cela sera de type DOUBLE

    Si on continue sur la formule :
    IM(x,y)= probabilité (x,y)*LOG2(probabilité (x,y)/(probabilité(x )*probabilité(y )))

    On a :

    IM = (nbrLignesCommunes(pc,pc2)/nblignes) * log2((nbrLignesCommunes(pc,pc2)/((double)nblignes)) / (nombreLigne(pc)*nombreLigne(pc2))).

    Selon, les type, on
    DOUBLE = INT/INT * DOUBLE

    Il faut encore une fois caster :

    IM = (nbrLignesCommunes(pc,pc2)/((double)nblignes)) * log2((nbrLignesCommunes(pc,pc2)/((double)nblignes)) / (nombreLigne(pc)*nombreLigne(pc2))).


    Cela devrait etre correcte.

    La formule est normalement celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IM = (nbrLignesCommunes(pc,pc2)/((double)nblignes))  *  log2((nbrLignesCommunes(pc,pc2)/((double)nblignes)) / (nombreLigne(pc)*nombreLigne(pc2)));
    Cela marche-t'il ?

  14. #14
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Super, ca marche
    Merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

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

Discussions similaires

  1. Probleme avec NAN valeur
    Par einsam dans le forum Flash/Flex
    Réponses: 0
    Dernier message: 20/05/2013, 19h17
  2. Lecture de nan et inf avec ifstream?
    Par keldorn dans le forum SL & STL
    Réponses: 1
    Dernier message: 05/09/2007, 09h34
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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