2015-03-22 1 views
4

J'effectue des tests unitaires en utilisant boost. Quand j'utilise BOOST_CHECK_CLOSE je reçois ce message d'erreur:BOOST_CHECK_CLOSE échoue même si les deux valeurs sont inférieures au seuil

difference{inf%} {-6.9388939e-18} and (0.0){0} exceeds 1.0000000000000001e-05% 

Cela semble bizarre pour moi comme la différence entre -6.9388939e-18 et 0,0 est inférieure 1.0000000000000001e-05%. De plus, je ne comprends pas pourquoi on dit que la différence est infinie.

Une idée sur la raison de ce comportement?

Répondre

9

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 

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.

+1

Une réponse très claire et la solution fonctionne parfaitement! Merci beaucoup! – gcswoosh

+0

Très utile en effet, merci. – gd1