Erreur d'arrondi en float [C] - C - Programmation
Marsh Posté le 02-12-2004 à 14:54:35
Oui c'est vrai.
Mais le problème c'est que ça ne marchera que dans ce cas précis, et si je fais une opération où l'erreur est à la troisième décimale je perdrai la 2e qui était pourtant bonne ...
Marsh Posté le 02-12-2004 à 14:55:54
Oui, c'est un bug dans les nombres réels. Dieu a été prévenu. En attendant, utilise printf("3*5.2=%2.2f\n", 3*f);
En effet, les nombres réels sont exprimés en base 2 (en binaire), donc toute la mantisse est exprimée de façon approchée en 2^0 + 2^(-1) + 2^(-2) + 2^(-3) + ...
Ta seule façon, c'est de demander à ton compilo de ne t'afficher que quelques chiffres après la virgule, pour être sûr d'avoir un arrondi correct.
Pour plus d'infos, google "IEEE 754" et regarde ça: http://docs.sun.com/source/806-3568/ncg_goldberg.html
Marsh Posté le 02-12-2004 à 15:01:42
pour preciser, avant le '.' c'est le nombre de caracteres et apres le nombre de decimales
%5.2f
ca peut aussi etre variable (il faut push l'argument entier dans l'ordre) "%*.*f", nbc, nbd, real
Marsh Posté le 02-12-2004 à 16:31:05
le probleme se pose seulement quand tu affiche et je trouve normal de donner les nombre de chiffre à afficher dans ce cas
Marsh Posté le 02-12-2004 à 16:37:47
spokup a écrit : le probleme se pose seulement quand tu affiche et je trouve normal de donner les nombre de chiffre à afficher dans ce cas |
non.
Code :
|
Marsh Posté le 02-12-2004 à 16:49:30
# float a=0.01;
# float b=0.1;
t'es schyzophrène pour changer d'avis sur le type de tes données avec la fin de la ligne ?
# a*10==b
et c'est tout sauf une bonne façon de comparer des flottants. Puisque fclc débarque, on en profite :
http://www.isty-info.uvsq.fr/~rume [...] c0011.html
Marsh Posté le 02-12-2004 à 17:52:27
tes programme doivent pas aller loin si tu compare tes flottant avec == !
Marsh Posté le 02-12-2004 à 17:59:45
spokup a écrit : tes programme doivent pas aller loin si tu compare tes flottant avec == ! |
Ouais, ils se finissent tous avec des "No ". Maintenant, relis calmement et à tête reposée mon message, et tu verras c'est qui que je contredis avec ce modeste bout de code.
Marsh Posté le 02-12-2004 à 18:31:16
merci à tous !
j'ai trouvé plein d'infos notamment grâce aux liens de Lam's
merci
Marsh Posté le 02-12-2004 à 14:48:40
Voilà un ptit programme :
int main (void)
{
float f = 5.2;
printf ("3*5.2=%f\n", 3*f);
return 0;
}
Et voilà sa sortie :
3*5.2=15.599999
Est-ce normal ? Puis-je faire qqchose pour avoir un résultat plus "logique" ?