2009-07-07 10 views
14

Quelqu'un peut-il décrire la différence de comportement entre BOOST_CHECK_CLOSE et BOOST_CHECK_CLOSE_FRACTION? The documentation implique que les deux macros traitent leur troisième paramètre de manière identique, ce qui me fait penser que la documentation est erronée.Différence entre BOOST_CHECK_CLOSE et BOOST_CHECK_CLOSE_FRACTION?

En particulier, BOOST_CHECK_CLOSE_FRACTION me donne des résultats bizarres recherche:

error in "...": difference between *expected{0} and *actual{-1.7763568394002506e-16} exceeds 9.9999999999999995e-07 

Y at-il une chasse aux sorcières parce que j'attends un résultat nul? Je n'ai pas réussi à lire les déclarations de macro sous-jacentes. Veuillez noter que BOOST_CHECK_SMALL n'est pas approprié pour mon cas d'utilisation (comparaison de deux vecteurs après une opération d'algèbre linéaire).

Répondre

6

Selon this discussion, un (BOOST_CHECK_CLOSE) traite le troisième paramètre comme exprimant un pourcentage, tandis que l'autre (BOOST_CHECK_CLOSE_FRACTION) le traite comme exprimant une fraction. Ainsi, .01 dans le premier devrait être équivalent à .0001 dans le second.

Pas certain si cela explique votre problème - obtenez-vous le même résultat impair avec BOOST_CHECK_CLOSE? Je ne serais pas choqué si le 0 a causé un problème - mais je n'ai pas d'expérience de première main avec les macros.

+1

Merci pour la réponse. Il semble que le zéro provoque le problème et qu'un comportement similaire se produise avec un argument zéro pour BOOST \ _CHECK \ _CLOSE et BOOST \ _CHECK \ _CLOSE \ _FRACTION –

5

Oui. Zéro n'est "proche" d'aucune valeur. Vous pouvez utiliser BOOST_CHECK_SMALL à la place.

1

@Gennadiy: zéro peut être être proche de petite valeur. :-) Les différences relatives augmentent arbitrairement si la valeur attendue est très proche de zéro.

est ici une fonction de contournement que j'utilise pour des valeurs doubles unité de test: si la valeur attendue est très faible ou nul, puis-je vérifier l'exiguïté de la valeur observée, sinon je vérifie la proximité:

void dbl_check_close(
    double expected, double observed, 
    double small, double pct_tol 
) { 
    if (std::fabs(expected) < small) { 
     BOOST_CHECK_SMALL(observed, small); 
    } else { 
     BOOST_CHECK_CLOSE(expected, observed, pct_tol); 
    } 
} 

de Bien sûr, ce serait génial d'avoir une macro BOOST_CHECK_SMALL_OR_CLOSE qui le fait automatiquement. Gennadiy pourrait peut-être parler à l'auteur de Boost.Test ;-)

Questions connexes