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++Builder Discussion :

Souci avec des float et leur précision


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut Souci avec des float et leur précision
    Bonjour,

    Je m'arrache les cheveux sur une appli depuis quelques heures pour un souci de précision de float...

    En simplifiant au maximum mon code, voici le test que j'effectue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float xmin, xmax, precision;
    int nbx;
     
    xmin = 599.4;
    xmax = 689.8;
    precision = 0.2;
     
    nbx = ((xmax-xmin)/precision);
    Faites le calcul vous-même... nbx doit être égal à 452.
    Or le débogueur me retourne 451 !!!

    En remplaçant nbx par un float, j'obtiens 451.999981689
    On se rapproche de ce que je suis en mesure d'attendre, mais si je commence à faire des boucles de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    float x;
    float *result = new float[nbx];  // Je suis obligé d'utiliser un int pour mon nbx dans ce cas là !
    int p;
     
    p = 0;
    for(x=xmin;x<=xmax;++x)
    {
       result[p] = x;
       ++p;
    }
     
    delete[] result;
    ... le décalage est de plus en plus important !

    Comment corriger ce type de problème ?

    A noter que je me suis amusé également avec des double. Le souci est le même, évidemment ! Je connais le problème de la précision des réels, tels qu'ils sont codés sur x bits, mais j'aimerais un peu m'en affranchir ! Comment faites-vous dans ce genre de cas ?

    Merci par avance.

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut benj63
    Regarde ce post, il n'y a pas vraiment trop de solutions

  3. #3
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    En utilisant des double ou des long double tu n'aura que plus de précision, je te conseille donc vivement d'utiliser ces types si tu recherche plus de précision :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      long double xmin, xmax, precision;
      int nbx;
      xmin = 599.4;
      xmax = 689.8;
      precision = 0.2;
      nbx = (xmax-xmin)/precision;
      //On obtient bien 452
    Si tu veux utiliser des float absolument, essai de regarder du coté des fonctions ceill et floor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      float xmin, xmax, precision;
      int nbx;
      xmin = 599.4;
      xmax = 689.8;
      precision = 0.2;
      nbx = ceill((xmax-xmin)/precision);
      //On obtient bien 452

  4. #4
    Membre éclairé Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par défaut
    Merci à tous.

    Dans le cas présent, le long double fonctionne pour la précision, par contre dans mon programme ça ne fonctionne plus pour certains paramètres.

    Je me suis débrouillé autrement en convertissant ce qui était possible en int...

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/08/2006, 12h14
  2. [Css]Soucis avec des div
    Par nebule dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/05/2006, 17h03
  3. [Tableaux] souci avec des simples quotes
    Par Jean Fi dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2006, 20h13
  4. Réponses: 9
    Dernier message: 13/04/2005, 22h08
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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