Problème très très étrange !!!

Problème très très étrange !!! - C++ - Programmation

Marsh Posté le 20-07-2006 à 21:47:44    

Bonjour j'utilise dev c++ et j'utilise le code - on ne peut plus simple - suivant :
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. float i=5;
  7. while(i>-1){
  8. i-=0.05;
  9. cout<<i<<endl;           
  10. }
  11.    
  12.     system("PAUSE" );
  13. }


 
Rien de difficile du tout !!!!
 
Cependant, lors de l'affichage, j'obtiens des valeurs telles : 0.5499999 (au lieu de 0.55)  
et lorsque i devrait etre égal à 0, j'ai  : -9.30578e-007 !!!
 
Pourquoi ca fait ca ? (jai essayé de remplacé float par double, mais j'ai toujours le problème quand i devrait etre égal à 0!!!)
 
 
Au secours ! Je m'arrache les cheveux !  :cry:
 
EDIT : j'ai essayé de mettre à la place de float i=5 float i=5.0f, aucun changement.
 
De plus, si dans ma boucle je fais :  

Code :
  1. if(i==1.2){
  2. cout<<"etape"<<endl;         
  3. }


 
le texte etape ne s'affiche jamais à l'écran alors que l'on peut constater sur la console qu'on passe bien par la valeur 1.2 !!!


Message édité par nisalon_caje le 20-07-2006 à 22:01:49
Reply

Marsh Posté le 20-07-2006 à 21:47:44   

Reply

Marsh Posté le 20-07-2006 à 22:08:31    

http://forum.hardware.fr/hardwaref [...] 0339-1.htm


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-07-2006 à 22:13:20    

d'accord, mais comment je fais alors pour que mon test marche ?

Reply

Marsh Posté le 20-07-2006 à 22:16:19    

ben c'est indiqué dans le topic : tu réduis la précision :spamafote:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-07-2006 à 22:19:42    

certes, mais moi je suis en c++, et la ils donnent la maniere pour la réduire en java

Reply

Marsh Posté le 20-07-2006 à 22:21:51    

http://docs.sun.com/source/806-3568/ncg_goldberg.html

nisalon_caje a écrit :

d'accord, mais comment je fais alors pour que mon test marche ?


Tu utilises un epsilon, il ne faut jamais utiliser un test d'égalité sur un float ou un double, c'est garanti que ça va foirer


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-07-2006 à 22:24:22    

désolé de dire ca, mais c'est un peu long pour que je lise ca ce soir, vous ne pourriez pas résumé ???
 
et sinon, comment faire (de manière simple) ce test?

Reply

Marsh Posté le 20-07-2006 à 22:31:21    

nisalon_caje a écrit :

désolé de dire ca, mais c'est un peu long pour que je lise ca ce soir, vous ne pourriez pas résumé ???


En résumé, il existe des nombres décimaux qui n'ont pas de représentation exacte en binaire (enfin en FP IEEE-754) et inversement, et les ordinateurs comptent en binaire et pas en décimal, donc le passage décimal -> binaire -> décimal peut partir d'un nombre exact et finir en un nombre inexact.

nisalon_caje a écrit :

et sinon, comment faire (de manière simple) ce test?


En  utilisant un epsilon sur une précision considérée suffisante.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 20-07-2006 à 22:38:31    

et comment utiliser un epsilon ?

Reply

Marsh Posté le 20-07-2006 à 23:01:12    

En ne testant pas si var == 3.14  mais plutot  si  |var - 3.14| < epsilon

Reply

Marsh Posté le 20-07-2006 à 23:01:12   

Reply

Marsh Posté le 20-07-2006 à 23:11:37    

ok merci beaucoup (pour valeur absolue j'utilise fabs() c'est bien ca ?)

Reply

Marsh Posté le 22-07-2006 à 20:09:53    

Tiens ça me rappelle des mauvais souvenirs à mes débuts

Reply

Marsh Posté le 23-07-2006 à 12:13:26    

non tu utilises std::abs<> et c'est tout.

Reply

Marsh Posté le 24-07-2006 à 18:22:18    

probleme classique en informatique qut tu peux resoudre de la facon suivante
 
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main()
{
 int i=0;
 float x=5.;
 while (x>-1)
 {
  x=5.-i*0.05;
  i++;
  cout<<x<<endl;            
 }
 system("PAUSE" );
 
}

Reply

Marsh Posté le 24-07-2006 à 19:07:01    

J'appelle pas ça résoudre le problème perso [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-07-2006 à 21:47:19    

Ca ne le résoud pas mais ça rend permet d'éviter l'accroissement itératif de la perte de précision.
Dans ce cas elle est constante alors qu'en itératif, elle croît comme grosso modo la racine carrée du nombre d'itérations.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 25-07-2006 à 00:11:32    

el muchacho a écrit :

Ca ne le résoud pas mais ça rend permet d'éviter l'accroissement itératif de la perte de précision.
Dans ce cas elle est constante alors qu'en itératif, elle croît comme grosso modo la racine carrée du nombre d'itérations.


Ouais enfin...

Code :
  1. >>> i = 5
  2. >>> while i > -1:
  3.     i = i-0.05
  4.     print repr(i)
  5.  
  6.     
  7. 4.9500000000000002
  8. 4.9000000000000004
  9. 4.8500000000000005
  10. 4.8000000000000007
  11. 4.7500000000000009
  12. 4.7000000000000011
  13. 4.6500000000000012
  14. 4.6000000000000014
  15. 4.5500000000000016
  16. 4.5000000000000018
  17. 4.450000000000002
  18. 4.4000000000000021
  19. 4.3500000000000023
  20. 4.3000000000000025
  21. 4.2500000000000027
  22. 4.2000000000000028
  23. 4.150000000000003
  24. 4.1000000000000032
  25. 4.0500000000000034
  26. 4.0000000000000036
  27. 3.9500000000000037
  28. 3.9000000000000039
  29. 3.8500000000000041
  30. 3.8000000000000043
  31. 3.7500000000000044
  32. 3.7000000000000046
  33. 3.6500000000000048
  34. 3.600000000000005
  35. 3.5500000000000052
  36. 3.5000000000000053
  37. 3.4500000000000055
  38. 3.4000000000000057
  39. 3.3500000000000059
  40. 3.300000000000006
  41. 3.2500000000000062
  42. 3.2000000000000064
  43. 3.1500000000000066
  44. 3.1000000000000068
  45. 3.0500000000000069
  46. 3.0000000000000071
  47. 2.9500000000000073
  48. 2.9000000000000075
  49. 2.8500000000000076
  50. 2.8000000000000078
  51. 2.750000000000008
  52. 2.7000000000000082
  53. 2.6500000000000083
  54. 2.6000000000000085
  55. 2.5500000000000087
  56. 2.5000000000000089
  57. 2.4500000000000091
  58. 2.4000000000000092
  59. 2.3500000000000094
  60. 2.3000000000000096
  61. 2.2500000000000098
  62. 2.2000000000000099
  63. 2.1500000000000101
  64. 2.1000000000000103
  65. 2.0500000000000105
  66. 2.0000000000000107
  67. 1.9500000000000106
  68. 1.9000000000000106
  69. 1.8500000000000105
  70. 1.8000000000000105
  71. 1.7500000000000104
  72. 1.7000000000000104
  73. 1.6500000000000103
  74. 1.6000000000000103
  75. 1.5500000000000103
  76. 1.5000000000000102
  77. 1.4500000000000102
  78. 1.4000000000000101
  79. 1.3500000000000101
  80. 1.30000000000001
  81. 1.25000000000001
  82. 1.2000000000000099
  83. 1.1500000000000099
  84. 1.1000000000000099
  85. 1.0500000000000098
  86. 1.0000000000000098
  87. 0.95000000000000973
  88. 0.90000000000000968
  89. 0.85000000000000964
  90. 0.80000000000000959
  91. 0.75000000000000955
  92. 0.7000000000000095
  93. 0.65000000000000946
  94. 0.60000000000000941
  95. 0.55000000000000937
  96. 0.50000000000000933
  97. 0.45000000000000934
  98. 0.40000000000000935
  99. 0.35000000000000936
  100. 0.30000000000000937
  101. 0.25000000000000938
  102. 0.20000000000000939
  103. 0.1500000000000094
  104. 0.1000000000000094
  105. 0.050000000000009398
  106. 9.3952623458903872e-015
  107. -0.049999999999990608
  108. -0.09999999999999061
  109. -0.14999999999999061
  110. -0.19999999999999063
  111. -0.24999999999999062
  112. -0.29999999999999061
  113. -0.3499999999999906
  114. -0.39999999999999059
  115. -0.44999999999999057
  116. -0.49999999999999056
  117. -0.54999999999999061
  118. -0.59999999999999065
  119. -0.6499999999999907
  120. -0.69999999999999074
  121. -0.74999999999999079
  122. -0.79999999999999083
  123. -0.84999999999999087
  124. -0.89999999999999092
  125. -0.94999999999999096
  126. -0.99999999999999101
  127. -1.0499999999999909
  128. >>>
  129. >>> i = 0
  130. >>> x = 5.0
  131. >>> while x > -1:
  132.     x = 5.0 - i * 0.05
  133.     i+=1
  134.     print repr(x)
  135.  
  136.     
  137. 5.0
  138. 4.9500000000000002
  139. 4.9000000000000004
  140. 4.8499999999999996
  141. 4.7999999999999998
  142. 4.75
  143. 4.7000000000000002
  144. 4.6500000000000004
  145. 4.5999999999999996
  146. 4.5499999999999998
  147. 4.5
  148. 4.4500000000000002
  149. 4.4000000000000004
  150. 4.3499999999999996
  151. 4.2999999999999998
  152. 4.25
  153. 4.2000000000000002
  154. 4.1500000000000004
  155. 4.0999999999999996
  156. 4.0499999999999998
  157. 4.0
  158. 3.9500000000000002
  159. 3.8999999999999999
  160. 3.8499999999999996
  161. 3.7999999999999998
  162. 3.75
  163. 3.7000000000000002
  164. 3.6499999999999999
  165. 3.5999999999999996
  166. 3.5499999999999998
  167. 3.5
  168. 3.4500000000000002
  169. 3.3999999999999999
  170. 3.3499999999999996
  171. 3.2999999999999998
  172. 3.25
  173. 3.2000000000000002
  174. 3.1499999999999999
  175. 3.0999999999999996
  176. 3.0499999999999998
  177. 3.0
  178. 2.9499999999999997
  179. 2.8999999999999999
  180. 2.8500000000000001
  181. 2.7999999999999998
  182. 2.75
  183. 2.6999999999999997
  184. 2.6499999999999999
  185. 2.5999999999999996
  186. 2.5499999999999998
  187. 2.5
  188. 2.4499999999999997
  189. 2.3999999999999999
  190. 2.3499999999999996
  191. 2.2999999999999998
  192. 2.25
  193. 2.1999999999999997
  194. 2.1499999999999999
  195. 2.0999999999999996
  196. 2.0499999999999998
  197. 2.0
  198. 1.9499999999999997
  199. 1.8999999999999999
  200. 1.8499999999999996
  201. 1.7999999999999998
  202. 1.75
  203. 1.6999999999999997
  204. 1.6499999999999999
  205. 1.5999999999999996
  206. 1.5499999999999998
  207. 1.5
  208. 1.4499999999999997
  209. 1.3999999999999999
  210. 1.3499999999999996
  211. 1.2999999999999998
  212. 1.25
  213. 1.1999999999999997
  214. 1.1499999999999999
  215. 1.0999999999999996
  216. 1.0499999999999998
  217. 1.0
  218. 0.95000000000000018
  219. 0.89999999999999947
  220. 0.84999999999999964
  221. 0.79999999999999982
  222. 0.75
  223. 0.70000000000000018
  224. 0.64999999999999947
  225. 0.59999999999999964
  226. 0.54999999999999982
  227. 0.5
  228. 0.45000000000000018
  229. 0.39999999999999947
  230. 0.34999999999999964
  231. 0.29999999999999982
  232. 0.25
  233. 0.19999999999999929
  234. 0.14999999999999947
  235. 0.099999999999999645
  236. 0.049999999999999822
  237. 0.0
  238. -0.050000000000000711
  239. -0.10000000000000053
  240. -0.15000000000000036
  241. -0.20000000000000018
  242. -0.25
  243. -0.30000000000000071
  244. -0.35000000000000053
  245. -0.40000000000000036
  246. -0.45000000000000018
  247. -0.5
  248. -0.55000000000000071
  249. -0.60000000000000053
  250. -0.65000000000000036
  251. -0.70000000000000018
  252. -0.75
  253. -0.80000000000000071
  254. -0.85000000000000053
  255. -0.90000000000000036
  256. -0.95000000000000018
  257. -1.0
  258. >>>


Y ptet du progrès mais c'est pas avec ça qu'il va pouvoir tester si i == 1.2 [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

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