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 :

float arrondi depuis un fichier


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut float arrondi depuis un fichier
    Bonjour,

    J'ai un petit problème avec la récupération de floats depuis un fichier texte.
    Pour les récupérer, je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string maligne;
    float f1,f2,f3;
    ifstream fichier("toto.truc");
    getline(fichier, maligne);
    istringstream iss(maligne);
    iss >> f1 >> f2 >> f3;
    Donc, pour vérifier que tout ça fonctionne, je réecris mes floats. Quand je ne définissait pas le nombre de décimales, il me tronquait en général à 4 chiffres après la virgule (au niveau de l'affichage). J'ai 6 chiffres après la virgule à chaque fois, donc j'ai mis un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout << setprecision(6) << fixed;
    avant la sortie. Mais là, je me retrouve avec des flottants à 6 chiffres après la virgule arrondis...

    Un petit exemple : dans mon fichier d'entrée, j'ai 4.700000, et quand je lis le float correspondant, j'ai 4.700001...

    Quand j'affiche plus de 6 chiffres après la virgule, j'ai d'autres chiffres qui apparaissent (à la place des 0 que je m'attendais à trouver).

    J'ai essayé de vider le flux après chaque affichage, mais ça fait pareil, donc le problème ne viendrait pas de là.

    D'où ça peut venir à votre avis?

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Seuls sont representables exactement par des nombres flottants des entiers multiplies par une puissance (eventuellement negative) de 2.

    4.7 n'est pas dans ce cas, donc ce qui est stocke est une autre valeur et si tu affiches suffisemment de chiffres apres la virgule, la difference va etre visible.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Merci pour ta réponse.

    Oui, ton explication est logique, en effet. Mais alors, comment je peux faire pour ne pas avoir d'arrondi sur le sixième chiffre après la virgule?... et déjà, est-ce qu'il y a une solution pour compenser l'arrondi?

  4. #4
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    pour ce genre de problème dans ma boite on fixe un epsilon (ex 10E-7) et quand on "créer un float avec du texte comme source, on le créer avec 8 ou 10 décimales. Ce qui permet de s'affranchir des arrondies. Mais c'est une solution assez lourde car tous tes tests doivent être changés
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float f1;
    float f2;
    /* du code ou f1 et f2 sont remplis */
    if(f1==f2)
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* dans header */
    #define EPSILON (0.0000001)
     
    float f1;
    float f2;
    /* du code ou f1 et f2 sont remplis */
    if(ABS(f1-f2)<=EPSILON)
    ayant des parties de code en C, c'est vraiment très lourd. En C++ je suppose qu'en définissant une classe myInt où tu rédéfinies les orpérateurs c'est plus simple.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Pour ce comparer deux valueurs en virgule flottante, on utilise systématiquement un epsilon.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Merci pour vos précisions.

    C'est vrai que j'aurais préféré avoir des résultats précis, mais bon, une erreur de l'ordre de 10E-6 ou 10E-7, ça pourrait peut être pas trop être génant pour les calculs.

    Sinon, je reposterais un message après m'être enervée sur le code

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Si tu souhaites sauvegarder dans un fichier un ensemble de variable en virgule flottante pour pouvoir ensuite les recharger à l'identique, dans ce cas, je te conseille d'utiliser un fichier binaire.

Discussions similaires

  1. Lecture depuis un fichier
    Par Wyatt dans le forum C++
    Réponses: 4
    Dernier message: 01/03/2005, 13h38
  2. pb d'insertion de données depuis un fichier externe-COPY
    Par boulou32 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 29/01/2005, 18h50
  3. [Applet][JAR]Charger une applet depuis un fichier jar
    Par CappCorp dans le forum Applets
    Réponses: 8
    Dernier message: 23/11/2004, 13h08
  4. afficher un bitmap 24/32 bits depuis un fichier
    Par cyber_N dans le forum MFC
    Réponses: 3
    Dernier message: 15/11/2004, 21h46
  5. comment tester la connexion depuis un fichier BATCH
    Par philippe_Aix dans le forum Oracle
    Réponses: 13
    Dernier message: 11/10/2004, 16h56

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