有人可以描述BOOST_CHECK_CLOSE
和BOOST_CHECK_CLOSE_FRACTION
之间的行为差异吗? The documentation意味着两个宏都以相同的方式处理它们的第三个参数,这使我怀疑文档是错误的。
特别是,BOOST_CHECK_CLOSE_FRACTION
给了我一些奇怪的结果:
error in "...": difference between *expected{0} and *actual{-1.7763568394002506e-16} exceeds 9.9999999999999995e-07
有没有因为我期望零结果?我没有成功阅读基础宏声明。请注意BOOST_CHECK_SMALL
不适合我的用例(比较线性代数运算后的两个向量)。
答案 0 :(得分:8)
根据this discussion,其中一个(BOOST_CHECK_CLOSE
)将第三个参数视为表示百分比,而另一个(BOOST_CHECK_CLOSE_FRACTION
)将其视为表达分数。因此,第一个中的.01应该等于第二个中的.0001。
不确定这是否可以解释您的问题 - 您是否会使用BOOST_CHECK_CLOSE
获得相同的奇怪结果?如果0引起了一个问题,我不会感到震惊 - 但我没有第一手宏的经验。
答案 1 :(得分:6)
是。零不是“接近”任何值。您可以改用BOOST_CHECK_SMALL。
答案 2 :(得分:1)
@Gennadiy:零可以接近任何小值。 :-) 如果预期值非常接近零,则相对差异会随之增大。
这是一个解决方法函数,我用它来测试双值:如果期望值非常小或为零,那么我检查观察值的小,否则我检查接近度:
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);
}
}
当然,拥有一个自动执行此操作的BOOST_CHECK_SMALL_OR_CLOSE
宏会很棒。 Gennadiy或许可以与Boost.Test的作者交谈; - )