comparer deix doubles

comparer deix doubles - C++ - Programmation

Marsh Posté le 24-07-2009 à 12:03:51    

youhou,
 
vous faites comment pour déterminer si un double est inférieur à un autre
 
if( (d2 - d1) > numeric_limits<double>::epsilon() )
{
//d1 est plus petit que d2
}
 
if( (d1 - d2) > numeric_limits<double>::epsilon() )
{
//d1 est plus grand que d2
}
 
 
 
c'est correct ?
 
 
Merci.


Message édité par Glock 17Pro le 24-07-2009 à 12:09:11
Reply

Marsh Posté le 24-07-2009 à 12:03:51   

Reply

Marsh Posté le 24-07-2009 à 13:14:46    

Ca te va pas d2<d1 ? T'as besoin d'autant de précision que ça ?

Reply

Marsh Posté le 24-07-2009 à 13:30:05    

hum oui je me suis mélanger les pinceaux avec tester l'égalité de deux doubles

Reply

Marsh Posté le 24-07-2009 à 15:40:46    

De toute manière, utiliser systématiquement epsilon() comme tu le fais pour l'égalité est tout aussi problématique (ça casse tout les cas où on a besoin de la transitivité, l'utilisation de epsilon() sans mise à l'échelle dépendante des données comparées ne fait pas ce qui est désiré si celles-ci sont trop grandes -- genre plus grande que 1 -- ou trop petite -- genre plus petite que epsilon()).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 24-07-2009 à 20:58:13    

Oui. Et utilise abs pour éviter de faire 2 fois le travail.

Reply

Marsh Posté le 25-07-2009 à 11:22:15    

ça serait quoi la bonne méthode donc

Reply

Marsh Posté le 25-07-2009 à 11:52:30    

Il n'y a pas une bonne méthode pour comparer deux doubles.  Il faut regarder le contexte et utiliser quelque chose de sensé pour celui-ci.  Si tu dépends de la transitivité, l'utilisation de == est la seule possibilité et tu as intérêt à ne pas avoir de problème d'approximation ou d'arrondi.  Si tu en as, quelque chose comme

 
Code :
  1. abs(f1-f2) <= K*epsilon*(abs(f1)+abs(f2))
 

où tu choisis K correctement tenir compte de l'importance de ceux-ci peut être la chose à utiliser.  Mais si les dénormaux entre en compte, tu vas peut-être devoir faire encore des choses plus complexes.


Message édité par Un Programmeur le 25-07-2009 à 15:51:02

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 25-07-2009 à 14:32:26    

c'est  pas du tout intuitif cette ligne

Reply

Marsh Posté le 25-07-2009 à 15:52:36    

Tu peux remplacer abs(f1)+abs(f2) par max(abs(f1), abs(f2))), c'est un peu plus facile à comprendre, mais risque d'être plus coûteux.
 
Les flottants sont, en première approximation, une représentation à erreur relative constante, epsilon() étant cette erreur relativement à 1.  Il faut donc comparer la différence à l'erreur potentielle sur le terme le plus grand en valeur absolue.  Le K est un multiplicateur pour tenir compte de l'accumulation des erreurs lors des calculs.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 25-07-2009 à 15:52:36   

Reply

Marsh Posté le 25-07-2009 à 16:44:30    

c'est impensable de faire un exemple avec des chiffres ? là je cale rien

Reply

Sujets relatifs:

Leave a Replay

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