[C] Erreur d'arrondi en float

Erreur d'arrondi en float [C] - C - Programmation

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" ?

Reply

Marsh Posté le 02-12-2004 à 14:48:40   

Reply

Marsh Posté le 02-12-2004 à 14:51:24    

remplace %f par %.1f

Reply

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 ...

Reply

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

Reply

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

Reply

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

Reply

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 :
  1. #include <stdio.h>
  2. float a=0.01;
  3. float b=0.1;
  4. int main()
  5. {
  6. if (a*10==b)
  7.    printf("Yes!\n" );
  8. else
  9.    printf("No :(\n" );
  10. }


Message édité par Lam's le 02-12-2004 à 16:40:36
Reply

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

Reply

Marsh Posté le 02-12-2004 à 17:52:27    

tes programme doivent pas aller loin si tu compare tes flottant avec == !

Reply

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. :p  

Reply

Marsh Posté le 02-12-2004 à 17:59:45   

Reply

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 :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed