Probleme d'arrondi

Signaler
Messages postés
22
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
28 mars 2005
-
Messages postés
22
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
4 octobre 2007
-
bonjour
j'ai un probleme d'arrondi avec les float. Pourtant je n'ai fait aucune conversion, je ne fait qu'ajouter des floats entre eux. En fait, au lieu d'avoir 5, j'aurais 4.99999999...

merci d'avance ^^

9 réponses

Messages postés
268
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
13 mai 2013
2
Saluts a toi,
Les "float" ne sont pas de très grand précision,si tu veux avoir une bonne précision utilise des "double" ils son beaucoup plus précis mais prenne plus de place en mémoire 64 bits contre 32.
Voilà
A++;
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011

mais il y aura toujours des problèmes d'arrondi avec les réels, car l'ordi utilise des puissances de 2, au lieu de puissances de 10, d'où le 4.9999. Pour l'ordi, des chiffres "ronds" ont une partie fractionnaire multiple de 2, par exemple 1.25 ou 5.625 par exemple etc...
C'est pour cela que lorsque il n'est pas possible d'utiliser des entiers, lors d'une comparaison par exemple, il faut prévoir une marge d'erreur :

float x;
if(x<5,001 && x>4.999)
{
//on considère = 5
...
}
Messages postés
268
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
13 mai 2013
2
bool fonction()
{
double d=12.25;
d+=1.52; //Cette fonction retournera vrai
if (d ==13.77)
return true;
else
return false
}

bool fonction()
{
float f =12.25;
f+=1.52; //Mais pas celle-ci
if (f == 13.77)
return true;
else
return false
}
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011

il est vrai que cela marche pour ces nombres là (peut de chiffres après la virgule), mais d'une manière générale ce n'est pas correct.
Cordialement.
Messages postés
268
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
13 mai 2013
2
Ya plus précis que double????
Messages postés
22
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
28 mars 2005

c'est chiant, ya pas moyen de passer a travers ce
probleme? par ce que j'aimerais changer le "pas" de mon perso dans un
jeu par rapport au ftp, mais comme vous l'avez dis, ya que 0,125 et
tout ses multiples qui marchent.



je sais pas mais gerer ce probleme avec if(x<5,001 && x>4.999)
{
//on considère = 5
...
}



ca fait pas tres propre, surtout que dans de nombreuse sources, ils n'ont pas l'air d'avoir ce probleme, donc voila
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011

plus de précision que double, je ne crois pas, a moins de passer par des classes spécialement crées. Par contre j'ai entendu parler de "long double", je ne sais pas si c équivalent a double...
tu peux utiliser des macros d'arrondis sinon (pour limiter les décimales)
Messages postés
22
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
28 mars 2005

en fait, j'ai beau les utiliser, ca change rien... (j'utilise nearint ou un truc dans le genre)
Messages postés
22
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
4 octobre 2007

SIGMA
j'ai presque le même problème avec ces floats "chiants" et je crois que j'ai une source qui pourrait peut être t'aider
la réponse est un peu tardive mais si tu est encore planté ds ce probleme mieux vaut tard que jamais

/* Compile options needed: none. Value of c is printed with a decimal point precision of 10 and  6 (printf rounded value by default) to show the difference
*/
#include <stdio.h>
#define EPSILON 0.0001   // Define your own tolerance
#define FLOAT_EQ(x,v) (((v - EPSILON) < x) &amp;&amp; (x <( v + EPSILON)))
void main()
{
    float a,b,c
    a=1.345f;
    b=1.123f;
    c=a+b;
   //if (FLOAT_EQ(c, 2.468))        // Remove comment for correct result
   if (c == 2.468)                 //Comment this line for correct result
   printf("They are equal\n");
else
   printf("They are not equal!!The value of c is %13.10f,or %f",c,c);
}