Incrémentation de float [Résolu]

Signaler
Messages postés
35
Date d'inscription
samedi 14 mai 2005
Statut
Membre
Dernière intervention
4 novembre 2010
-
Messages postés
35
Date d'inscription
samedi 14 mai 2005
Statut
Membre
Dernière intervention
4 novembre 2010
-
Bonjour tout le monde, voici mon probleme c'est surement assez débile mais je n'arrive pas a trouver comment faire, voici mon code :
main(){
       float i, j;
       printf("%f\n", g);
       i=0;
       scanf("%f", &j);
       while(i<5){
                  printf("%f, %f\n", i, j);
                  if(i==j){
                           printf("%f", i);
                           }
                           i=i+0.1;
                           }
       Sleep(20000);
       }
Le probleme c'est que i devrait prendre les valeurs 0; 0.1; ......; 4.9; 5 alors que en fait dans mon programme il n'a pas de valeur precise par exemple quand i devrait etre egale a 4.9, il est en fait egale a 4.899998.
Comment résoudre ce probleme merci d'avance.

6 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
les nombres flottants sont d'une précision limitée; ainsi il ne faut jamais écrire d'égalité, mais vérifier que, par exemple, la différence entre deux nombres est inférieurs à une valeur d'erreur limite :

#define EPSILON (0.00001)
__int32

_CheckEquals(
double a,
double b)
{

double diff=a-b;
*(
__int64*)&diff&=0x7FFFFFFFFFFFFFFF; // valeur absolue

return (diff<EPSILON)?1:0;
}
Messages postés
35
Date d'inscription
samedi 14 mai 2005
Statut
Membre
Dernière intervention
4 novembre 2010

arf oubliez la ligne printf("%f\n", g);
elle est en trop ^^
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Déclare i en double.
Messages postés
35
Date d'inscription
samedi 14 mai 2005
Statut
Membre
Dernière intervention
4 novembre 2010

Merci maintenant la valeur de i est precise reste encore un probleme :
le if(i==j) ne fonctionne pas !?!?
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Il ne faut jamais utiliser l'opérateur == pour comparer des flottants.

#include <limits>
#include <cmath>
using namespace std;
...
const double eps = numeric_limits<double>::epsilon();
...
if ( abs( i - j ) < eps )
{
...
}
Messages postés
35
Date d'inscription
samedi 14 mai 2005
Statut
Membre
Dernière intervention
4 novembre 2010

Merci beaucoup pour toutes ces info très interessantes,  mon programme marche a merveille !
Encore merci et Bonne Prog !