BOOST_CHECK_CLOSE和BOOST_CHECK_CLOSE_FRACTION之间的区别?

时间:2009-07-07 16:44:45

标签: boost

有人可以描述BOOST_CHECK_CLOSEBOOST_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不适合我的用例(比较线性代数运算后的两个向量)。

3 个答案:

答案 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的作者交谈; - )