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èmes de chiffres après la virgule avec le C++


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut problèmes de chiffres après la virgule avec le C++
    Bonjour tous,

    j'ai un problème en C++: moi et un amis nous avons les deux mêmes programmes mais nos n'avons pas exatement les memes résultats.

    voici un exemple de resultats que j'ai ecrit dans un fichier texte:
    lui
    2.9605049E-10 0.0021543931 0.021949603
    moi
    2.9605e-10 0.00215439 0.0219496

    On remarque que mes resultats sont arrondis assez rapidement, or le problème est que j'aimerai avoir exactement le même ordre de troncature/arrondi que lui (pour des raisons de verifications de nos resultats)

    comment puis je faire s'il vous plait?


    remarque: quand je dis exactement les memes resultats ce n'est pas que dans l'affichage mais aussi lors des calculs eux memes

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    A première vue c'est un problème de précision et de formatage de chaine de caractère tout simplement.

    Il existe des systèmes de gestion de l'affichage de nombre au format scientifique.
    Je connait les TformatSetting qui pourraient t'aider, je te joint un petit exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    float reel = 0.021949603;
    TFormatSettings FormatSettings;
    GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FormatSettings);
    FormatSettings.DecimalSeparator ='.';
    std::string strReel = AnsiString(FormatFloat("' '0.000000E+00;-0.000000E+00",reel )).c_str();
    La chaine strReel vaudra donc = "2.194960E-02"

    Attention ce code marche que sous embarcadero ou c++ builder, mais ca peut te donner un ordre d'idée de ce que tu peut faire.
    Si vous utilisez un système similaire vous serez sur d'obtenir le même affichage.

    Quel environnement de développement utilisez vous ?

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Bonjour

    Problème très classique (comprendre : une petite recherche sur le forum t'aurait permis de retrouver d'autres posts sur le sujet) de représentation des nombres réels et des erreurs d'arrondis.

    Cf "What every computer scientist should know about floating-point arithmetic" et autres posts sur ce forum

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci pour votre aide, j'utilise code::block.
    en fait je cherche une solution qui ne depend pas de IDE car mon code doit pouvoir etre utilisée sur d'autres PC

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    Force la sortie avec le format que tu souhaites en utilisant les flags et autres manipulateurs des flux de la STL.

    Boost.Format peut aussi t'aider.

    Bref, rien d'implicite : construit explicitement ton format de sortie.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Par exemple tu pourrait utiliser la fonction sprintf qui te permettra d'écrire ton nombre au format que tu souhaite !

    Voici un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float reel = 0.021949603;
    char strReel[13];
    sprintf(strReel,"%.6E",reel);
    std::cout << "mon reel formate : " << strReel << std::endl;
    char c = getchar();
    return 0;
    ce code donne la sortie "mon reel formate : 2.194660E-02".

    tu trouvera la description de la fonction sur ce lien :
    http://www.cplusplus.com/reference/c...stdio/sprintf/

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Knacki Voir le message
    Par exemple tu pourrait utiliser la fonction sprintf qui te permettra d'écrire ton nombre au format que tu souhaite !
    Voici un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float reel = 0.021949603;
    char strReel[13];
    sprintf(strReel,"%.6E",reel);
    std::cout << "mon reel formate : " << strReel << std::endl;
    char c = getchar();
    return 0;
    ce code donne la sortie "mon reel formate : 2.194660E-02".
    tu trouvera la description de la fonction sur ce lien :
    http://www.cplusplus.com/reference/c...stdio/sprintf/
    merci beaucoup pour cette réponse!

    en fait j'essai d'écrire dans un fichier texte avec un nombre important de chiffre apres la virgule j'ai essayé cette methode:
    http://www.cplusplus.com/reference/i...ase/precision/

    mais ca ne marche qu'avec le "cout"
    je pense que le probleme va etre similaire avec sprintf? ca va m'afficher dans la console les bon arrondi mais ca ne fonctionne pas si je veux ecrire dans un fichier.... ?

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    merci beaucoup pour cette réponse!

    en fait j'essai d'écrire dans un fichier texte avec un nombre important de chiffre apres la virgule j'ai essayé cette methode:
    http://www.cplusplus.com/reference/i...ase/precision/

    mais ca ne marche qu'avec le "cout"
    je pense que le probleme va etre similaire avec sprintf? ca va m'afficher dans la console les bon arrondi mais ca ne fonctionne pas si je veux ecrire dans un fichier.... ?
    Il est idiot d'utiliser (s)printf en C++ alors que les flux avec leur manipulateur te permettent la même chose de façon mieux typée donc plus sure.

    Il faut jouer avec std::setprecision mais aussi std::fixed/std::scientific, std::setw. Bref, cherche la section manipulateur ici.

    Pour avoir la même chose dans un fichier et dans std::cout, utilise std::fstream pour tes fichiers

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Il est idiot d'utiliser (s)printf en C++ alors que les flux avec leur manipulateur te permettent la même chose de façon mieux typée donc plus sure.

    Il faut jouer avec std::setprecision mais aussi std::fixed/std::scientific, std::setw. Bref, cherche la section manipulateur ici.

    Pour avoir la même chose dans un fichier et dans std::cout, utilise std::fstream pour tes fichiers

    merci, en effet les infos que tu m'as donné semble pouvoir régler mon problème,
    je vais juste m'assurer que ca ne fonctionne pas que pour les "cout"
    je te tiens informé dès que je me suis dépatouillé de tout cela.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Salut 3Darchi et les autres,
    j'ai essayé un peu tout ce que je pouvais et je n'ai toujours pas résolu mon problème.

    ==> voici le nombre maximum de caractères qui s'affiche pour le nombre 2.4750111e-10 lorsque j'écris dans un fichier texte:
    2.47501e-10

    ==> mon collegue à C++ builder et sans faire aucunes modifications, lorsqu'il écrit dans un fichier texte il obtient bien un grand nombre de chiffre apres la virgule.

    Cette différence entre lui (C++ builder) et moi (C::B) est génante car nous avons une différence dans une conditions qui vient du 6ème chiffre après la virgule, le problème c'est que je ne sais pas si cela vient du fait que notre valeur n'est pas la meme où si c'est C::B qui arrondi mon resultat alors que pour C++Builder il n'est pas arrondi....

  11. #11
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    sauf que un IDE n'affecte en rien le resultat d'un programme.
    Le compilateur oui par contre ...

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Montre nous un peu de code.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Joel F Voir le message
    sauf que un IDE n'affecte en rien le resultat d'un programme.
    Le compilateur oui par contre ...
    ah oui en effet, un effet à faire serait de changer de compilateur, comment puis je faire ceci?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Montre nous un peu de code.
    je ne sais pas quoi vous montrer car il n'y a rien de special dans mon code, il est le plus classique possible...

    par contre voici une partie des resultats de mon collegue et une partie des miens.
    Les siens:
    0.010014937 2.3579477E-06 2.9605084E-10 2.475015E-10
    0.010017531 2.5937425E-06 2.960509E-10 2.475015E-10
    0.010020384 2.8531167E-06 2.9605096E-10 2.475015E-10
    les miens
    0.0100149 2.35795e-06 2.96051e-10 2.47501e-10
    0.0100175 2.59374e-06 2.96051e-10 2.47501e-10
    0.0100204 2.85312e-06 2.96051e-10 2.47501e-10

    Sur ces valeurs il y a des conditions, du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (valeur1 > 2.357955)
    {
    blabla
    }
    et j'ai pas les memes resultats avec mon code et son code et je ne sais pas si cela vient de la troncature ou si il y a vraiment une erreur de calcul au 6eme chiffre apres la virgule...

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Graphic Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 602
    Points : 4 129
    Points
    4 129
    Par défaut
    lu,

    J'ai déjà eu le cas de mon coté et cela ne venait pas du programme mais de windows.

    en particulier les options de windows relatif à la langue et au format des nombres.

    sous win 7 tu va dans "Panneau de configuration" -> "Modifier le format de la date de l'heure et des nombres" -> "Paramètres supplémentaire" et la tu met par exemple 9 en nombre de décimales et hop magique.

    Après si tu à compilé son code et que tu obtiens ses résultats, bah c'est pas ça donc montre nous ton code de calcul ou d'affichage.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    tres interessant, merci d'avoir participé

    A+

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

Discussions similaires

  1. Représentation d'un nombre avec 'n' chiffres apres la virgule
    Par Contractofoued dans le forum MATLAB
    Réponses: 5
    Dernier message: 29/11/2007, 14h35
  2. calcule de PI avec nombre préci de chiffres aprés la virgule!
    Par do_key_120 dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 17/10/2007, 23h58
  3. Réponses: 5
    Dernier message: 19/06/2007, 09h59
  4. Réponses: 3
    Dernier message: 10/02/2006, 16h31
  5. Pourcentage avec deux chiffres après la virgule
    Par Oluha dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/03/2005, 14h47

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