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

  FORUM HardWare.fr
  Programmation
  C

  Problème très simple mais irésolu

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème très simple mais irésolu

n°1511926
axialee
Posté le 07-02-2007 à 18:23:21  profilanswer
 

Bonjour,  
peut être pourrez vous éclairer ma lanterne :
je veux tester la valeur numérique d'une variable,
je n'ai jamais eu ce genre de problème jusqu'à présent, je n'y comprend plus rien :
 
voici un programme simplicime résumant mon probleme :
 
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NMAX 100
int main(void)
{
float variable;
variable=0;
 
do
{      
variable=variable+0.01;
 
if(variable==0.5)
{
printf("ça marche enfin" );
system("pause" );
}
printf("%10.4f \n",variable);
 
}
while (variable <=1.99);
 
 
system("pause" );
}
 
 
 
Dans le test if(variable==0.5), il ne se passe jamais rien quelque soit la valeur que j'y mette pourquoi ?

mood
Publicité
Posté le 07-02-2007 à 18:23:21  profilanswer
 

n°1511929
0x90
Posté le 07-02-2007 à 18:25:12  profilanswer
 

parce que c'est un nombre flottant.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1511932
axialee
Posté le 07-02-2007 à 18:29:14  profilanswer
 

merci, c bizzare avant je mettai toujours du flottant et ça marchai... en tout cas c bon now thanks

n°1511957
axialee
Posté le 07-02-2007 à 19:26:57  profilanswer
 

bon en fait ça marche que pour les chiffres rond : 0.5 1 ,  1.5 mais pas pour les chiffres du genre 1.2 0.9... pourquoi ???
 
que dois - je mettre à la place de float pour que le if le detecte

n°1511974
xilebo
noone
Posté le 07-02-2007 à 20:20:15  profilanswer
 

un indice  
augmente la précision d'affichage dans ton printf (en mettant 10.10f par exemple), et tu verras que quand tu incrementes de 0.01, ça ne vaut pas "exactement" 0.01. C'est du à l'imprécision des nombres flottants. (voir http://fr.wikipedia.org/wiki/IEEE_754 )
 
ex de résultat :
 

Code :
  1. 0.0099999998
  2. 0.0199999996
  3. 0.0299999993
  4. 0.0399999991
  5. 0.0499999989
  6. 0.0599999987
  7. 0.0699999984
  8. 0.0799999982
  9. 0.0899999980
  10. 0.0999999978
  11. 0.1099999975
  12. 0.1199999973
  13. 0.1299999971
  14. 0.1399999969
  15. 0.1499999966
  16. 0.1599999964
  17. 0.1699999962
  18. 0.1799999960
  19. 0.1899999958
  20. 0.1999999955
  21. 0.2099999953
  22. 0.2199999951
  23. 0.2299999949
  24. 0.2399999946
  25. 0.2499999944
  26. 0.2599999942
  27. 0.2699999940
  28. 0.2799999937
  29. 0.2899999935
  30. 0.2999999933
  31. 0.3099999931
  32. 0.3199999928
  33. 0.3299999926
  34. 0.3399999924
  35. 0.3499999922
  36. 0.3599999920
  37. 0.3699999917
  38. 0.3799999915
  39. 0.3899999913
  40. 0.3999999911
  41. 0.4099999908
  42. 0.4199999906
  43. 0.4299999904
  44. 0.4399999902
  45. 0.4499999899
  46. 0.4599999897
  47. 0.4699999895
  48. 0.4799999893
  49. 0.4899999890
  50. 0.4999999888
  51. 0.5099999886
  52. 0.5199999884
  53. 0.5299999882
  54. 0.5399999879
  55. 0.5499999877
  56. 0.5599999875
  57. 0.5699999873


 
du coup ta comparaison entre ces nombres et 0.5 ne sera jamais vraie :)


Message édité par xilebo le 07-02-2007 à 20:41:53
n°1511983
axialee
Posté le 07-02-2007 à 20:39:15  profilanswer
 

merci beaucoup, je ne pensais pas que l'imprecision était de cet ordre, je vais proceder avec des nombres entiers et ensuite diviser.

n°1512053
Ange_blond
Posté le 07-02-2007 à 23:55:29  profilanswer
 

sinon tu fait une macro de comparasion en introduisant une variable Epsilon de l'ordre de 0,001 et tu teste si ta variable appratient à l'intervalle +/- Epsilon...
 
Je fait ca partout moi...

n°1512054
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-02-2007 à 00:06:50  profilanswer
 

axialee a écrit :


Dans le test if(variable==0.5), il ne se passe jamais rien quelque soit la valeur que j'y mette pourquoi ?


Normal, == et != ne fonctionnent quasiment jamais avec les flottants.
 
Ceci fonctionne :  

Code :
  1. #include <stdio.h>
  2. int main (void)
  3. {
  4.    double variable = 0;
  5.    do
  6.    {
  7.       variable = variable + 0.01;
  8.       if (variable >= 0.5)
  9.       {
  10.          printf ("%.4f \n", variable);
  11.          printf ("ca marche enfin" );
  12.          break;
  13.       }
  14.    }
  15.    while (variable <= 1.99);
  16.    return 0;
  17. }


0.5000
ca marche enfin
Press ENTER to continue.


Pose des questions si tu ne comprends pas


Message édité par Emmanuel Delahaye le 08-02-2007 à 00:07:15

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

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

  Problème très simple mais irésolu

 

Sujets relatifs
problème d'écriture dans la bdd avec un formulaireExcel -> Word : Problème de saut de ligne/page lors d'une fusion
Problème de connexion avec oracle 10g express edition[RESOLU]Problème execution index.html
Problème urgent vbs erreur 800A01A8Probleme assez con
Probleme avec des champs EDIT [ RESOLU ][MSSQL et PHP] Problème de boucle...
[batch] problème avec mon batch d'insertionProblème pour récuperer une image dans une variable
Plus de sujets relatifs à : Problème très simple mais irésolu


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