plans near español drink customer activate boost

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.