如何在Boost测试框架中检查double值中的前15个相关数字是否相同?

问题描述:

我试图用什么似乎是专为工作:BOOST_CHECK_CLOSE,所以我有以下测试:如何在Boost测试框架中检查double值中的前15个相关数字是否相同?

BOOST_AUTO_TEST_CASE(MultivariateNormalDensityTest) 
{ 
    double TOLLERANCE=1e-14; 

    Eigen::Vector3d mu(0.0, 1.0, 2.0); 
    Eigen::Matrix3d sigma; 
    sigma << 2.0, 1.0, 0.5, 
      1.0, 2.3, 0.7, 
     0.5, 0.7, 1.7; 

    MultivariateNormalDensity<3> mnd(mu, sigma); 

    BOOST_CHECK_CLOSE(0.027671392189542814988, mnd(Eigen::Vector3d(0.0, 1.0, 2.0)), TOLLERANCE); 
    BOOST_CHECK_CLOSE(0.0027063822550173750707, mnd(Eigen::Vector3d(2.0, 1.0, 0.5)), TOLLERANCE); 
    BOOST_CHECK_CLOSE(0.024708597088231143424, mnd(Eigen::Vector3d(0.5, 1.5, 2.5)), TOLLERANCE); 
    BOOST_CHECK_CLOSE(0.026554587643995836849, mnd(Eigen::Vector3d(-0.3, 0.6, 1.8)), TOLLERANCE); 
    //examples calculated using R 
} 

然而,第一次检查失败,错误:

/home/ga1009/PhD/cpp/grzesLib/test/multivariatenormaltests.cpp(36): error in "MultivariateNormalDensityTest": difference{3.76141e-14%} between 0.027671392189542814988{0.027671392189542815} and mnd(Eigen::Vector3d(0.0, 1.0, 2.0)){0.027671392189542805} exceeds 1e-14% 

当我做数学我得到:

(0.027671392189542815-0.027671392189542805)/0.027671392189542805=0.00000000000000036138406 

这是小于1e-14。我在这里做错了什么?

+0

我不知道库,但我猜的公差是相对于输入值,即它真的检查你是否在0.027 * 1e-14 = 2.7e-16之内。 ('宽容'中只有'l')。 – Rup

公差被指定为百分比,你就要去通过100修复:

double TOLERANCE=1e-12; // Percent 
+1

哇,我永远不会认为开发人员会投入真正的百分比!谢谢。 – Grzenio