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

BOOST_CHECK_CLOSE fails even if the two values are below the threshold

我正在使用 boost 执行单元测试。当我使用 BOOST_CHECK_CLOSE 时,我收到此失败消息:

difference{inf%} {-6.9388939e-18} and (0.0){0} exceeds 1.0000000000000001e-05%

这对我来说听起来很奇怪,因为 -6.9388939e-18 和 0.0 之间的差异低于 1.0000000000000001e-05%。另外,我不明白为什么说差异是无限的。

知道这种行为背后的原因吗?

BOOST_CHECK_CLOSE使用Knuth的tole运行ce谓词比较浮点数,即

abs(x - y) / abs(x) <= eps && abs(x - y) / abs(y) <= eps

其中 xy 是要比较的数字,eps 是 tole运行ce epsilon。换句话说,它测试 xy 的距离不超过 xeps 百分比 1,反之亦然.

这个谓词有很多值得推荐的属性(特别是在处理非常大或非常小的数字时,或者当 xy 的数量级不是 known/fixed 时),但缺点是它在零处有一个奇点(根据它,没有什么接近零,因为零的 eps% 是零,导致 tole运行ce 为零),这就是您 运行 遇到的问题。

您可以将其替换为

BOOST_CHECK_SMALL(x - y, epsilon);

使用绝对 epsilon 值2。或者,由于我假设您测试中的零是一个固定数字,所以

BOOST_CHECK_SMALL(x, epsilon);

1 BOOST_CHECK_CLOSE 将给定的 epsilon 解释为百分比。我一直想知道为什么。
2 请注意,BOOST_CHECK_SMALL 不会将给定的 epsilon 解释为百分比,而是解释为绝对值。