comparer deix doubles - C++ - Programmation
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 ?
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
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()).
Marsh Posté le 24-07-2009 à 20:58:13
Oui. Et utilise abs pour éviter de faire 2 fois le travail.
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 :
|
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.
Marsh Posté le 25-07-2009 à 15:43:09
http://en.wikipedia.org/wiki/Unit_in_the_last_place
http://docs.sun.com/source/806-3568/ncg_goldberg.html
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.
Marsh Posté le 25-07-2009 à 16:44:30
c'est impensable de faire un exemple avec des chiffres ? là je cale rien
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