gcs*_*osh 7 c++ boost unit-testing
我正在使用boost执行单元测试.当我使用BOOST_CHECK_CLOSE时,我收到此失败消息:
difference{inf%} {-6.9388939e-18} and (0.0){0} exceeds 1.0000000000000001e-05%
Run Code Online (Sandbox Code Playgroud)
这听起来很奇怪,因为-6.9388939e-18和0.0之间的差异低于1.0000000000000001e-05%.此外,我不明白为什么它说差异是无限的.
有关这种行为背后原因的任何想法?
Win*_*ute 11
BOOST_CHECK_CLOSE 使用Knuth的容差谓词来比较浮点数,即
abs(x - y) / abs(x) <= eps && abs(x - y) / abs(y) <= eps
Run Code Online (Sandbox Code Playgroud)
在哪里x,y要比较的数字eps是公差epsilon.换句话说,它测试其x不大于eps百分之1的x远离y,并且反之亦然.
这个谓词有许多属性可以推荐它(特别是当处理非常大或非常小的数字时,或者当数量级为x和y未知/固定时),但缺点是它的奇点为零(没有关闭)根据它,eps为零,因为零的百分比为零,导致公差为零),这就是你遇到的问题.
你可以用它替换它
BOOST_CHECK_SMALL(x - y, epsilon);
Run Code Online (Sandbox Code Playgroud)
使用绝对epsilon值2.或者,因为我假设您的测试中的零是固定数字,只是
BOOST_CHECK_SMALL(x, epsilon);
Run Code Online (Sandbox Code Playgroud)
1 BOOST_CHECK_CLOSE将给定的epsilon解释为百分比.我一直想知道为什么.
2请注意,BOOST_CHECK_SMALL不会将给定的epsilon解释为百分比,而是将其解释为绝对值.