Incrémentation de float [Résolu]

hacker_mt 35 Messages postés samedi 14 mai 2005Date d'inscription 4 novembre 2010 Dernière intervention - 1 août 2008 à 01:35 - Dernière réponse : hacker_mt 35 Messages postés samedi 14 mai 2005Date d'inscription 4 novembre 2010 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 1 août 2008 à 14:11
3
Merci
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;
}

Merci cs_juju12 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 80 internautes ce mois-ci

Commenter la réponse de cs_juju12
hacker_mt 35 Messages postés samedi 14 mai 2005Date d'inscription 4 novembre 2010 Dernière intervention - 1 août 2008 à 01:36
0
Merci
arf oubliez la ligne printf("%f\n", g);
elle est en trop ^^
Commenter la réponse de hacker_mt
cs_Lucky92 180 Messages postés mercredi 22 décembre 2004Date d'inscription 16 août 2012 Dernière intervention - 1 août 2008 à 07:37
0
Merci
Déclare i en double.
Commenter la réponse de cs_Lucky92
hacker_mt 35 Messages postés samedi 14 mai 2005Date d'inscription 4 novembre 2010 Dernière intervention - 1 août 2008 à 13:19
0
Merci
Merci maintenant la valeur de i est precise reste encore un probleme :
le if(i==j) ne fonctionne pas !?!?
Commenter la réponse de hacker_mt
cs_Lucky92 180 Messages postés mercredi 22 décembre 2004Date d'inscription 16 août 2012 Dernière intervention - 1 août 2008 à 14:15
0
Merci
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 )
{
...
}
Commenter la réponse de cs_Lucky92
hacker_mt 35 Messages postés samedi 14 mai 2005Date d'inscription 4 novembre 2010 Dernière intervention - 1 août 2008 à 14:23
0
Merci
Merci beaucoup pour toutes ces info très interessantes,  mon programme marche a merveille !
Encore merci et Bonne Prog !
Commenter la réponse de hacker_mt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.