Problème très simple mais irésolu

Problème très simple mais irésolu - C - Programmation

Marsh Posté le 07-02-2007 à 18:23:21    

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 ?

Reply

Marsh Posté le 07-02-2007 à 18:23:21   

Reply

Marsh Posté le 07-02-2007 à 18:25:12    

parce que c'est un nombre flottant.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-02-2007 à 18:29:14    

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

Reply

Marsh Posté le 07-02-2007 à 19:26:57    

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

Reply

Marsh Posté le 07-02-2007 à 20:20:15    

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
Reply

Marsh Posté le 07-02-2007 à 20:39:15    

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

Reply

Marsh Posté le 07-02-2007 à 23:55:29    

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

Reply

Marsh Posté le 08-02-2007 à 00:06:50    

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/
Reply

Sujets relatifs:

Leave a Replay

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