Probleme d'arrondi

cs_Darkan Messages postés 22 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 28 mars 2005 - 1 mars 2005 à 12:59
islem1982 Messages postés 22 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 4 octobre 2007 - 20 mai 2005 à 15:40
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 ^^
A voir également:

9 réponses

tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
1 mars 2005 à 13:10
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++;
0
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011
1 mars 2005 à 13:52
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
...
}
0
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
1 mars 2005 à 14:39
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
}
0
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011
1 mars 2005 à 14:42
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.
0

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

Posez votre question
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
1 mars 2005 à 14:53
Ya plus précis que double????
0
cs_Darkan Messages postés 22 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 28 mars 2005
1 mars 2005 à 17:00
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
0
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011
1 mars 2005 à 18:38
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)
0
cs_Darkan Messages postés 22 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 28 mars 2005
28 mars 2005 à 18:34
en fait, j'ai beau les utiliser, ca change rien... (j'utilise nearint ou un truc dans le genre)
0
islem1982 Messages postés 22 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 4 octobre 2007
20 mai 2005 à 15:40
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);
}
0
Rejoignez-nous