即使两个值低于阈值,BOOST_CHECK_CLOSE也会失败

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百分之1x远离y,并且反之亦然.

这个谓词有许多属性可以推荐它(特别是当处理非常大或非常小的数字时,或者当数量级为xy未知/固定时),但缺点是它的奇点为零(没有关闭)根据它,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解释为百分比,而是将其解释为绝对值.