Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2111 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Erreur d'arrondi en float

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Erreur d'arrondi en float

n°912920
freewol
Ceci n'est pas une citation
Posté le 02-12-2004 à 14:48:40  profilanswer
 

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

mood
Publicité
Posté le 02-12-2004 à 14:48:40  profilanswer
 

n°912922
spokup
Posté le 02-12-2004 à 14:51:24  profilanswer
 

remplace %f par %.1f

n°912924
freewol
Ceci n'est pas une citation
Posté le 02-12-2004 à 14:54:35  profilanswer
 

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

n°912926
Lam's
Profil: bas.
Posté le 02-12-2004 à 14:55:54  profilanswer
 

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

n°912932
cris56
Posté le 02-12-2004 à 15:01:42  profilanswer
 

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

n°913027
spokup
Posté le 02-12-2004 à 16:31:05  profilanswer
 

le probleme se pose seulement quand tu affiche et je trouve normal de donner les nombre de chiffre à afficher dans ce cas

n°913033
Lam's
Profil: bas.
Posté le 02-12-2004 à 16:37:47  profilanswer
 

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
n°913038
Taz
bisounours-codeur
Posté le 02-12-2004 à 16:49:30  profilanswer
 

# 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

n°913091
spokup
Posté le 02-12-2004 à 17:52:27  profilanswer
 

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

n°913100
Lam's
Profil: bas.
Posté le 02-12-2004 à 17:59:45  profilanswer
 

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  

mood
Publicité
Posté le 02-12-2004 à 17:59:45  profilanswer
 

n°913140
freewol
Ceci n'est pas une citation
Posté le 02-12-2004 à 18:31:16  profilanswer
 

merci à tous !
j'ai trouvé plein d'infos notamment grâce aux liens de Lam's
merci :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Erreur d'arrondi en float

 

Sujets relatifs
[ASP] Erreur dans le codeerreur compilation gcc parse error at the end of input
erreur avec la fonction system => unable to fork....Erreur: "multiples definition" gcc
[GTK & C++] compilation de classe avec erreur[C] erreur de bibliotheque
Comment passer de quatre caracteres a 1 float ?retour erreur de la fonction php mail()
Probleme erreur TomcatErreur 500 --> .htaccess
Plus de sujets relatifs à : [C] Erreur d'arrondi en float


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR