none
Problème avec les float RRS feed

  • Question

  • Bonjour à toutes et à tous,

     

    J'ai un problème avec les float.
    Je communique avec une base de données dans laquelle est stockée notamment un tarif.
    L'un de ces tarifs est 1.43 (et le stockage est correct dans la base).
    Dès que je l'importe en C++ dans un float, je n'ai plus 1.43, mais 1.4299999 !!

     

    J'ai voulu vérifier si cela pouvait provenir de moi, et j'ai donc testé celà :
    float Test = 1.43;

    Dès l'affectation, Test vaut 1.4299999 !!

     

    Et celà est aléatoire, certains nombres sont stockés correctement dans le type float, d'autres pas.
    Et vous comprendrez que dès qu'on doit effectuer un calcul portant sur des milliers d'articles, 1.43, c'est totalement différent 1.4299999.

     

    Quelqu'un peut-il m'expliquer comment corriger ce problème?

     

    Merci d'avance pour vos réponses.

    mardi 25 mars 2008 14:08

Toutes les réponses

  • Bonjour nico44,

    Il s'agit d'une caractéristique standard dans la representation des float et d'un pb classique en software design.

    en fait 1.43 n'est pas un float.

    Un float se represente sous la forme signe, exposant, mantisse.

    Ton 1.43 est arrondi au moment de sa transformation en float c'est a dire au moment de l'affectation (float Test=1.43) et la precision obtenu dépendra de ton processeur.

    Je suppose que tu observes la valeur de ton float en utilisant le deboggeur et tu auras sans doute noté que 1.43 est arrondi ainsi que 1.44 mais pas 1.45...

    Cependant si tu affiches ta valeur avec

    Code Snippet
     float Test=1.43f;
     TRACE("Test =%f Test*Test=%f\n",Test,Test*Test);

     

    Donneras

    Test =1.430000 Test*Test=2.044900

     

    Maintenant, quand à corriger le problème dans tout les cas, difficile, limite CPU oblige..tu peux modifier la prise en charge des floatting point par le processeur,Propriétés de configuration-->C/C++--> Generation de code:Modèle de virgule  flottante, et intercepter les float_exception. Tu peux aussi regarder du côté des fonctions _control87 et _controlfp. Elles te permettront de controler la manière dont les float sont traités par le compilo. Attention ces fonctions ne concernent que les architectures x86.

     

    Je t'invite à consulter le site ieee (http://www.ieee.org)  pour les détails concernant cette representation et concernant la manipulation des flottants.

    Plusieurs excellent article sont disponible sur le web et en particulier celui ci sur msdn http://msdn2.microsoft.com/en-us/library/aa289157.aspx#floapoint_topic17

     

    Cordialement

    Michel4CE

    dimanche 30 mars 2008 15:45