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 :

Probl�me de pr�cision Visual C++ sous win


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 62
    Par d�faut Probl�me de pr�cision Visual C++ sous win
    Bonjour,

    j'ai post� hier pensant avoir un pb dans mon programme et en fait cela ne vient pas de moi.
    Voil� j'ai cod� une appli C/C++ sur snowleopard avec Xcode et tout marchait pour le mieux.
    En recondant le tout sous visual C++, bizarre, r�sultats aberrants.
    En affinant mes recherches, j'ai finalement vu l'endroit ou cela coin�ait mais aucune id�e pour r�soudre le probl�me.

    Alors voila, j'ai une fonction simple, appelons la f d�finie comme suit dans mo programme sous Xcode

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    double f(double x){
    return 0.5*(1-erf(x/sqrt(2)))
    }
    Les fonction C99 et donc 'erf' n'�tant pas prises en charge sous VC++, je fais appel � boost, et la fonction reste la m�me � part que j'appelle boost::math::erf

    Passons ensuite au r�sultats.
    La fonction erf est une fonction d�finie sur tout R comme le montre
    http://fr.wikipedia.org/wiki/Fichier:Erf_plot.svg

    D�clarons
    double a = -37.1326;
    double b = -8.26506;
    double ra = f(a);
    double rb = f(b);

    f(a) et f(b) sont donc tr�s proches de 1

    Si je fais des printf("%e", ra) et printf("%e",rb)
    je vais voir s'afficher sur la console 1.000000e+00 sous Xcode et VC++

    Maintenant, faisons la diff�rence
    double dif = f(a)-f(b);
    et printf("%e",dif);

    Sous Xcode on obtient 1.11022e-16, sous VC++ on obtient 0.000000e+000


    VC++ m'enl�ve donc toute pr�cision en faisant la diff�rence. Mais d'un autre c�t�, pourquoi Xcode m'enl�ve-t-il �galement la pr�cision sur l'affichage s�par� de f(a) et f(b) et m'affiche quelquechose de correct pour la diff�rence.

    Toujours est-il que je dois avoir cette pr�cision et que je n'ai pas la solution � ce pb

    Merci a celui qui m'apportera une aide

  2. #2
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    DIff�rentes librairies C == diff�rentes mani�re de g�rer la pr�cision du FPU. Sous Visual C++, tu peux utiliser la fonction _controlfp() pour g�rer ce point par toi m�me.

    Ensuite, la question de l'affichage est du domaine du "chacun fait ce qu'il veut". Aucune norme ne pr�cise comment afficher un float ou un double.
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 62
    Par d�faut
    Ok, donc il existe une solution au probl�me.. je me doutais que c'�tait les libs et je me doutais qu'il y avait une solution vu que matlab sous win fait cela sans soucis.
    Merci

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 62
    Par d�faut
    Bon j'ai tent�, et je n'y parviens pas.

    Voici le petit bout de code.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // PrecisionCalcul.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include <C:\Program Files (x86)\boost\boost_1_44\boost\math\special_functions\erf.hpp>
    #include <float.h>
    #pragma fenv_access (on)
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    	unsigned int control_word_x87;
    	control_word_x87 = __control87_2(_PC_24, MCW_PC,&control_word_x87, 0);
     
    	double a = -37.1326;
    	double b = -8.26506;
    	double d = 2;
    	double dd = 0.5;
    	double ra = dd*(1-boost::math::erf(a/sqrt(d)));
    	double rb = dd*(1-boost::math::erf(b/sqrt(d)));
    	double dif = ra- rb;
     
    	printf("ra=%e\n",ra);
    	printf("rb=%e\n",rb);
    	printf("dif=%e\n",dif);
     
    }
    La sortie est toujours la m�me
    ra=1.000000e+000
    rb=1.000000e+000
    dif=0.000000e+000

    Conclusion je ne sais pas comment utiliser ce que tu viens de me donner...

  5. #5
    Membre extr�mement actif

    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 408
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 408
    Par d�faut
    Sous Xcode on obtient 1.11022e-16, sous VC++ on obtient 0.000000e+000
    techniquement ces 2 valeurs sont identiques, � DBL_EPSILON pr�s bien sur, mais vu qu'on ne compare jamais 2 valeurs flottantes directement entre elles...

    pourquoi as tu besoin de cette "pr�cision"?

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 62
    Par d�faut
    J'ai besoin de cette pr�cision car les r�sultats que je calcule sont des probabilit�s, en gros une multiplication de 2 diff�rences semblables � celle pr�sent�e dans le post plus haut, donc si on m'arrondi mon 0.1e-16 a 0..
    mon 1.1e-16 multipli� par mon 3.48e+15 devient 0.. pas tr�s cool tu l'admettras.
    Ce n'�tait pas un chipotage pour grignoter quelques chiffres... Cela est indispensable au bon fonctionnement de ce que j'ai fait
    Mais j'ai install� MPIR et MPFR et tout va bien maintenant
    Probl�me solved.
    Merci

  7. #7
    Membre extr�mement actif

    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 408
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 408
    Par d�faut
    j'avais lu un article il y a longtemps qui montrait l'aggravation de l'impr�cision des flottants sur les op�rations simples.

    bonne chance pour tes probas.

Discussions similaires

  1. R�ponses: 3
    Dernier message: 20/11/2011, 19h14
  2. Probl�me avec DataBase Desktop 7 sous Win Vista ?
    Par maker dans le forum C++Builder
    R�ponses: 0
    Dernier message: 22/03/2010, 23h11
  3. Probl�me de mot de passe sous win server 2003
    Par koKoTis dans le forum Windows Serveur
    R�ponses: 5
    Dernier message: 16/09/2007, 14h25
  4. R�ponses: 2
    Dernier message: 30/10/2006, 15h25
  5. R�ponses: 7
    Dernier message: 27/09/2005, 21h40

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