BOOST_CHECK_CLOSE
utilise le prédicat de tolérance de Knuth pour comparer les nombres à virgule flottante, qui est
abs(x - y)/abs(x) <= eps && abs(x - y)/abs(y) <= eps
Où x
, y
sont les chiffres à comparer et eps
est le epsilon de tolérance. En d'autres termes, il teste que x
n'est pas supérieur à eps
pour cent de à l'écart de y
, et vice versa.
Ce prédicat possède de nombreuses propriétés à le recommander (en particulier lorsque l'on travaille avec des nombres très grands ou très petits, ou lorsque les ordres de grandeur des x
et y
ne sont pas connus/fixe), mais un inconvénient est qu'il a une singularité à zéro (rien n'est proche de zéro, selon lui, car eps
% de zéro est zéro, conduisant à une tolérance de zéro), et c'est le problème que vous avez rencontré.
Vous pouvez le remplacer par
BOOST_CHECK_SMALL(x - y, epsilon);
utiliser une valeur epsilon absolue . Ou, puisque je suppose que le zéro dans votre test est un nombre fixe, juste
BOOST_CHECK_SMALL(x, epsilon);
BOOST_CHECK_CLOSE
interprète le epsilon donné en pourcentage. Je me suis toujours demandé pourquoi.
Notez que BOOST_CHECK_SMALL
n'interprète pas l'epsilon donné en pourcentage mais en valeur absolue.
Une réponse très claire et la solution fonctionne parfaitement! Merci beaucoup! – gcswoosh
Très utile en effet, merci. – gd1