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

  FORUM HardWare.fr
  Programmation
  C++

  [C, C++] Problème d'arrondis ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C, C++] Problème d'arrondis ...

n°274752
freeman_78
Posté le 22-12-2002 à 16:34:19  profilanswer
 

Bonjour !
Voilà pour un programme de résolution du troisième degré je passe par une fonction qui résoud des équations du second degré...  
Mais j'ai un problème :)
Lorsque les valeurs traitées pas ma fonction qui résout le second degré sont assez proche de 0, le programme fonctionne mal. Au lieu de me renvoyer une racine réelle double, il me renvoit 2 racines réelles mais très peu défférentes (elles diffèrent à partir de 10^-5 environ). Du coup, ça ne va pas dans le bon cas dans la fonction qui résoud le troisième degré et ça ne fait pas ce qu'il faudrait.
 
Si quelqu'un pouvait m'aider pour ces galères d'arrondis, ce serait sympa !! :)
 
J'utilise uniquement des variables de type double.
 
Je ne mets pas de code, mais si vous voulez en voir une partie, pas de problème ...
 
Voilà, merci d'avance ! et bon dimanche  :sol:

mood
Publicité
Posté le 22-12-2002 à 16:34:19  profilanswer
 

n°274755
Carbon_14
Posté le 22-12-2002 à 16:49:55  profilanswer
 

Un peu de code (le coeur du traitement) et/ou exemple de données pourrait aider à saisir le problème.. :)  :jap:

n°274757
youdontcar​e
Posté le 22-12-2002 à 17:01:37  profilanswer
 

pour tester l'égalité avec des flottants, il faut toujours tester avec une marge :
 
 
#define epsilon 1e-5
 
float n = 4;
float f = tonCalcul();
 
 
if (f == n) // MAL
 
if (fabs(f -n) < epsilon) // OK
 
//
 
si tu veux de la précision '100%', tu devrais utiliser une classe qui représente les nombres symboliquement (par ex, racine de 2 divisé par 144)


Message édité par youdontcare le 22-12-2002 à 17:01:50
n°274828
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 22-12-2002 à 18:57:11  profilanswer
 

y a les "long double" aussi sur 96bits


---------------
du bon usage de rand [C] / [C++]
n°274841
freeman_78
Posté le 22-12-2002 à 19:13:06  profilanswer
 

j'ai essayé en mettant que des "long double" et ça a rien changé ...
 
pour les classes on a pas encore appris :(

n°274843
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 22-12-2002 à 19:14:27  profilanswer
 

ben si tu pouvais quand meme donner un peu de code....


---------------
du bon usage de rand [C] / [C++]
n°274846
Carbon_14
Posté le 22-12-2002 à 19:22:18  profilanswer
 

Sioupli, un peu de code pour voir où ça coïnce. :sarcastic:

n°274858
freeman_78
Posté le 22-12-2002 à 20:00:21  profilanswer
 

vi désolé :D fallait manger ... ;)
 
bon ben je vous balance la coupable : ma fonction de résolution des équations du second degré ...
 

Code :
  1. int ResolDeuxieme(double a, double b, double c)
  2. {
  3. discr = b*b - 4*a*c;
  4. if (discr > 0)
  5. {
  6.  varRacine_deuxiemeX1Re = (-b-sqrt(discr))/(2*a);
  7.  varRacine_deuxiemeX2Re = (-b+sqrt(discr))/(2*a);
  8.  return 2;
  9. }
  10. else if (discr == 0)
  11. {
  12.  varRacine_deuxiemeX1Re = -b/(2*a);
  13.  return 3;
  14. }
  15. else
  16. {
  17.  if (b==0)
  18.  {
  19.   varRacine_deuxiemeX1Im = -sqrt(-discr)/(2*a);
  20.   varRacine_deuxiemeX2Im =  sqrt(-discr)/(2*a);
  21.   return 4;
  22.  }
  23.  else
  24.  {
  25.   varRacine_deuxiemeX1Re = -b/(2*a);
  26.   varRacine_deuxiemeX2Re = -b/(2*a);
  27.   varRacine_deuxiemeX1Im = -sqrt(-discr)/(2*a);
  28.   varRacine_deuxiemeX2Im =  sqrt(-discr)/(2*a);
  29.   return 6;
  30.  }
  31. }
  32. }


 
Voilà   :??:

n°274860
youdontcar​e
Posté le 22-12-2002 à 20:02:58  profilanswer
 

freeman_78 a écrit :

if (discr == 0)

et voilà ... à remplacer par un test avec marge, comme dit plus haut.

n°274873
freeman_78
Posté le 22-12-2002 à 20:24:47  profilanswer
 

oki alors je vais essayer ça :)
 
merci !!


Message édité par freeman_78 le 22-12-2002 à 20:25:00
mood
Publicité
Posté le 22-12-2002 à 20:24:47  profilanswer
 

n°274884
Carbon_14
Posté le 22-12-2002 à 20:48:23  profilanswer
 

la déclaration de discr a été "éludée" pour être plus clair ?
 
Y en a qui préfèrent préciser le caractère double ou float des "constantes" en mettant 0.0 et 2.0, mais d'autres disent que le compilateur est assez doué pour comprendre... sinon 0 serait int, 2 aussi.

n°274885
*syl*
--&gt; []
Posté le 22-12-2002 à 20:48:30  profilanswer
 

youdontcare a écrit :

pour tester l'égalité avec des flottants, il faut toujours tester avec une marge :
 
 
#define epsilon 1e-5
 
float n = 4;
float f = tonCalcul();
 
 
if (f == n) // MAL
 
if (fabs(f -n) < epsilon) // OK
 
//
 
si tu veux de la précision '100%', tu devrais utiliser une classe qui représente les nombres symboliquement (par ex, racine de 2 divisé par 144)

Code :
  1. if (fabs (f - n) <= epsilon * fabs (f))

n°274948
freeman_78
Posté le 22-12-2002 à 23:51:00  profilanswer
 

Merci à tous ! voilà ce que j'ai fait et qui fonctionne :

Code :
  1. int ResolDeuxieme(double a, double b, double c)
  2. {
  3. double epsilon;
  4. epsilon = 1e-3; //précision pour les discriminents proches de 0
  5. discr = b*b - 4*a*c;
  6. if (discr > epsilon)
  7. {
  8.  varRacine_deuxiemeX1Re = (-b-sqrt(discr))/(2*a);
  9.  varRacine_deuxiemeX2Re = (-b+sqrt(discr))/(2*a);
  10.  return 2;
  11. }
  12. else if (fabs(discr) <= epsilon)
  13. {
  14.  varRacine_deuxiemeX1Re = -b/(2*a);
  15.  return 3;
  16. }
  17. else
  18. {
  19.  if (b==0)
  20.  {
  21.   varRacine_deuxiemeX1Im = -sqrt(-discr)/(2*a);
  22.   varRacine_deuxiemeX2Im =  sqrt(-discr)/(2*a);
  23.   return 4;
  24.  }
  25.  else
  26.  {
  27.   varRacine_deuxiemeX1Re = -b/(2*a);
  28.   varRacine_deuxiemeX2Re = -b/(2*a);
  29.   varRacine_deuxiemeX1Im = -sqrt(-discr)/(2*a);
  30.   varRacine_deuxiemeX2Im =  sqrt(-discr)/(2*a);
  31.   return 6;
  32.  }
  33. }
  34. }


Message édité par freeman_78 le 22-12-2002 à 23:51:22
n°275018
youdontcar​e
Posté le 23-12-2002 à 09:16:58  profilanswer
 

il faut utiliser le test epsilon sur chaque test d'égalité.


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

  [C, C++] Problème d'arrondis ...

 

Sujets relatifs
[ C - Gros debutant ]Probleme de scanfprobleme pour retirer le chemin d'un fichier
probleme de variablePetit probleme pour fermer une applet
probleme sur la commande echo [shell de Bourne]Probleme de concurrence d'acces inexpliquable ....
problème avec 'showInputDialog'problème de comparaison de date (mysql).
Probleme avec des matrices de transformation 3D ...probleme de <SELECT> et présélection d'une value [RESOLU]
Plus de sujets relatifs à : [C, C++] Problème d'arrondis ...


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