near - ¿Diferencia entre BOOST_CHECK_CLOSE y BOOST_CHECK_CLOSE_FRACTION?
boost mobile store (3)
¿Puede alguien describir la diferencia de comportamiento entre BOOST_CHECK_CLOSE
y BOOST_CHECK_CLOSE_FRACTION
? La documentación implica que ambas macros tratan su tercer parámetro de manera idéntica, lo que me hace sospechar que la documentación es incorrecta.
En particular, BOOST_CHECK_CLOSE_FRACTION
me da algunos resultados extraños:
error in "...": difference between *expected{0} and *actual{-1.7763568394002506e-16} exceeds 9.9999999999999995e-07
¿Hay un gotcha porque espero un resultado de cero? No he tenido éxito en leer las declaraciones macro subyacentes. Tenga en cuenta que BOOST_CHECK_SMALL
no es apropiado para mi caso de uso (comparando dos vectores después de una operación de álgebra lineal).
@Gennadiy: Zero puede estar cerca de cualquier valor pequeño . :-) Las diferencias relativas crecen arbitrariamente grandes si el valor esperado es muy cercano a cero.
Esta es una función alternativa que utilizo para realizar pruebas unitarias de valores dobles: si el valor esperado es muy pequeño o cero, verifico la pequeñez del valor observado, de lo contrario, verifico la cercanía:
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);
}
}
Por supuesto, sería genial tener una macro BOOST_CHECK_SMALL_OR_CLOSE
que haga esto automáticamente. Gennadiy quizás podría hablar con el autor de Boost.Test ;-)
De acuerdo con esta discusión , uno ( BOOST_CHECK_CLOSE
) trata el tercer parámetro como expresando un porcentaje, mientras que el otro ( BOOST_CHECK_CLOSE_FRACTION
) lo trata como expresando una fracción. Entonces, .01 en el primero debería ser equivalente a .0001 en el segundo.
No estoy seguro si eso explica tu problema: ¿obtienes el mismo resultado extraño con BOOST_CHECK_CLOSE
? No me sorprendería si el 0 causara un problema, pero no tengo experiencia de primera mano con las macros.
Sí. El cero no está "cerca" de ningún valor. Puedes usar BOOST_CHECK_SMALL en su lugar.