Incrémentation de float

Résolu
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010 - 1 août 2008 à 01:35
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010 - 1 août 2008 à 14:23
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

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
1 août 2008 à 14:11
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;
}
3
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010
1 août 2008 à 01:36
arf oubliez la ligne printf("%f\n", g);
elle est en trop ^^
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
1 août 2008 à 07:37
Déclare i en double.
0
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010
1 août 2008 à 13:19
Merci maintenant la valeur de i est precise reste encore un probleme :
le if(i==j) ne fonctionne pas !?!?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
1 août 2008 à 14:15
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 )
{
...
}
0
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010
1 août 2008 à 14:23
Merci beaucoup pour toutes ces info très interessantes,  mon programme marche a merveille !
Encore merci et Bonne Prog !
0
Rejoignez-nous