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

BOOST_CHECK_CLOSE fails even if the two values are below the threshold

本文关键字:CHECK BOOST CLOSE 失败 阈值 于阈值 两个      更新时间:2023-10-16

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

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

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

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

BOOST_CHECK_CLOSE使用Knuth的容差谓词来比较浮点数,这是

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

其中xy是要比较的数字,eps是公差ε。换句话说,它测试xy的距离不超过xeps1,反之亦然。

这个谓词有很多特性值得推荐(尤其是在处理非常大或非常小的数字时,或者当xy的数量级未知/固定时),但缺点是它在零处有一个奇异性(根据它的说法,没有什么接近零,因为零的eps%是零,导致公差为零),这就是你遇到的问题。

你可以用代替它

BOOST_CHECK_SMALL(x - y, epsilon);

使用绝对ε值2。或者,因为我假设你测试中的零是一个固定的数字,只是

BOOST_CHECK_SMALL(x, epsilon);

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