Problème très très étrange !!! - C++ - Programmation
Marsh Posté le 20-07-2006 à 22:08:31
http://forum.hardware.fr/hardwaref [...] 0339-1.htm
Marsh Posté le 20-07-2006 à 22:13:20
ReplyMarsh Posté le 20-07-2006 à 22:16:19
ben c'est indiqué dans le topic : tu réduis la précision
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
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
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?
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.
Marsh Posté le 20-07-2006 à 23:01:12
En ne testant pas si var == 3.14 mais plutot si |var - 3.14| < epsilon
Marsh Posté le 20-07-2006 à 23:11:37
ok merci beaucoup (pour valeur absolue j'utilise fabs() c'est bien ca ?)
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" );
}
Marsh Posté le 24-07-2006 à 19:07:01
J'appelle pas ça résoudre le problème perso
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.
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. |
Ouais enfin...
Code :
|
Y ptet du progrès mais c'est pas avec ça qu'il va pouvoir tester si i == 1.2
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 :
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 !
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 :
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