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

Langage C++ Discussion :

Approximation d'un float


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 52
    Par défaut Approximation d'un float
    Je réalise actuellement un petit programme pour traiter des trames

    J'ai des float, int et string
    Pour les float, je fais face à un problème que je n'arrive pas à résoudre.

    La trame qui m'intéresse avec en gras ce que je prends
    $IIMWV,220.1,R,000.30,N,A

    Voilà ma méthode pour traiter les valeurs que j'ai extrait le 220.1
    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
     
    float WM918::DecapsuleDirectionVent(String DirectionBrute)
    {
            int     Cen,
                    Diz,
                    Uni,
                    Dix;
            float   Resultat=0;
     
            Cen=(VitesseBrute[1] & 0x0f);
            Diz=(VitesseBrute[2] & 0x0f);
            Uni=(VitesseBrute[3] & 0x0f);
            Dix=(VitesseBrute[5] & 0x0f);
     
            Resultat= (Cen*100)+(Diz*10)+Uni+(Dix*0.1);
     
            return Resultat;
    }
    Je devrais récupérer un float = 220.1 alors que je récupère un float = 220,100006103516

    Je ne comprends pas pourquoi même en mettant un Resultat=Resultat-0,000006103516 avant le return je trouve toujours 220,100006103516 !

    Merci d'avance pour vos futurs réponses

  2. #2
    Inactif  


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

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    C'est un problème de représentation binaires des nombres réels. Tu trouveras beaucoup d'information sur cette problèmatique (en particulier What Every Computer Scientist Should Know About Floating-Point Arithmetic). Tu peux tenter de passer aux doubles ou aux représentation à virgule fixe

  3. #3
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Ou bien, étant donné la fonction qui lit les données, il suffit de mettre dans un nombre entier en sachant que cet entier est le flottant représenté fois 10.
    Il suffit ensuite de diviser par 10 si on a absolument besoin de ce flottant.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 52
    Par défaut
    merci à vous 2 pour vos réponses !

    Je n'avais pas penser à diviser par 10 très bonne idée je vais test !

  5. #5
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Non mais ça ne marchera pas plus, hein.

    C'est juste que 0,000006103516 est l'imprécision minimum que doit comporter ton float.
    Les deux solution sont alors soit de passer par un double, soit d'émuler du fixed point en stockant uniquement le nombre fois dix et en n'utilisant jamais de float.

  6. #6
    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
    Par défaut
    Effectivement, ce genre de données se traite bien avec un entier en changeant ton unité de représentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int WM918::DecapsuleDirectionVent(String VitesseBrute)
    {
            const int Cen=(VitesseBrute[1] & 0x0f);
            const int Diz=(VitesseBrute[2] & 0x0f);
            const int Uni=(VitesseBrute[3] & 0x0f);
            const int Dix=(VitesseBrute[5] & 0x0f);
     
            const int Resultat= (Cen*1000)+(Diz*100)+(Uni*10)+Dix;
     
            return Resultat;
    }
    Pourquoi WM918::DecapsuleDirectionVent(String VitesseBrute) n'accède à aucune variable membre de la classe ? Des fonctions libres avec un espace de nom c'est une solution alternative aux classes à fonctions statiques.

Discussions similaires

  1. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  2. [IB701] problème de float ??
    Par BoeufBrocoli dans le forum InterBase
    Réponses: 5
    Dernier message: 15/09/2003, 14h15
  3. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15
  4. [7RC3] Formatage de champs float
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 19/05/2003, 09h38
  5. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32

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