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 :

Erreur de calcul avec la fonction log


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut Erreur de calcul avec la fonction log
    bonjour,

    voila j'y perd mon latin, j'effectue des calculs, généralement tout ce passe bien mais sur certaines valeurs, j'obtiens des valeurs NaN sans raison;

    lorsque je fais:
    double x = (wPos[i]+epsilon)/(wNeg[i]+epsilon);
    cerr<<"x "<<x<<endl;
    j'obtiens: x 0.0138675
    mais lorsque je fais:
    double val = log(x);
    cerr<<val<<endl;
    j'obtiens : nan.
    Mais si je fais: cerr<<log(double((wPos[i]+epsilon)/(wNeg[i]+epsilon)))<<endl;
    j'obtiens :
    -4.27821

    Bon voila je m'arrache les cheveux, si quelqu'un peut m'aider.
    Merci

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    t'es sur que tu fais pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cer << log( val ) << endl;
    à la place de :
    Moi je ne reproduis pas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Non, c'est bien ce que je fais; j'ai copié le code. En fait, pour quasiment toutes les valeurs je n'ai pas de problème et pour cette valeur particulière j'ai cette erreur, j'ai l'impression que c'est peut-être un bug de la fonction log sous mac, je code xcode sous leopard.

  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
    Par défaut
    Tu pourrais nous donner un programme complet qui reproduise ça ? Avec entre autre les valeurs exactes des wPos, wNeg et epsilon ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    En fait, je pense pas que ce soit une erreur de log puisque l'instruction suivante passe:
    cerr<<log(double((wPos[i]+epsilon)/(wNeg[i]+epsilon)))<<endl;
    mais doit y avoir un truc qui m'échappe. Voici exactement tout ce que je fais:

    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
    19
    const double epsilon = 0.0001;
    valarray<double> wPos;
    valarray<double> wNeg;
    /.../je remplis les valarray
    for(int i = 0; i < wPos.size();++i){
     
          cerr<<" wp "<<wPos[i]<<" wn "<<wNeg[i]<<endl;
          double wp = wPos[i];
          double wn = wNeg[i];
          double test = (wp+epsilon)/(wn+epsilon);
          double x = (wPos[i]+epsilon)/(wNeg[i]+epsilon);
          double val_0 = log(x);
          double val_1 = log(test);
          cerr<<"test "<<test<<endl;
          cerr<<"x "<<x<<endl;
          cerr<<"val 0"<<val_0<<endl;
          cerr<<"val 1"<<val_1<<endl;
         cerr<<log(double((wPos[i]+epsilon)/(wNeg[i]+epsilon)))<<endl;
    }
    Voila j'ai bug pour la valeur i = 0;
    ou j'obtiens le resultat suivant:
    wp 0 wn 0.00711111
    test 0.0138675
    x 0.0138675
    val 0nan
    val 1nan
    -4.27821

  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
    Par défaut
    Tu n'as pas encore montré dans ton code la valeur de wPos[i] et wNeg[i] (tu as bien affiché ce qu'elles valent, mais l'affichage ne repésente pas la vraie valeur). Aussi je réitère ma demande : Si tu veux qu'on ait une chance de pouvoir t'aider, il faut montrer un bout de code minimale et complet qui reproduise le problème.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Je sais bien mais je ne peux malheuresement pas copier l'ensemble pour reproduire l'erreur car en fait les données remplies dans les vecteurs sont des caractéristques extraites sur une vidéo. Il s'agit d'un programme de traitements d'images. Mais je me demandais si quelqu'un qui a déja eu des problèmes avec les valarray et les fonctions log.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Je viens de tester sous windows, pas de problème ça marche, donc le bug a l'air d'être lié au compilo de xcode, si quelqu'un a déjà eu des problèmes avec la fonction log sous mac, ça m'interesserait!

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Si bug il y a, il se situerai plus vraisemblablement au niveau du processeur qu'au niveau du compilateur, la fonction log étant câblée dans le processeur en général.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/08/2013, 16h22
  2. [XL-2007] Erreur de calcul de la fonction Int() partie entiére d'un Nb en VB
    Par GOLDINGMAROC dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 01/03/2012, 17h31
  3. [Dates] Erreur de calcul avec la fonction mktime ?
    Par Xpertfly dans le forum Langage
    Réponses: 1
    Dernier message: 18/11/2008, 11h40
  4. erreur de linkage avec une fonction extern
    Par ali.ensi dans le forum C
    Réponses: 5
    Dernier message: 12/03/2008, 23h23
  5. erreur de calcul avec SUM
    Par peyro51 dans le forum Excel
    Réponses: 6
    Dernier message: 14/07/2007, 09h14

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