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
其中 x
、y
是要比较的数字,eps
是 tole运行ce epsilon。换句话说,它测试 x
与 y
的距离不超过 x
的 eps
百分比 1,反之亦然.
这个谓词有很多值得推荐的属性(特别是在处理非常大或非常小的数字时,或者当 x
和 y
的数量级不是 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 解释为百分比,而是解释为绝对值。
我正在使用 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
其中 x
、y
是要比较的数字,eps
是 tole运行ce epsilon。换句话说,它测试 x
与 y
的距离不超过 x
的 eps
百分比 1,反之亦然.
这个谓词有很多值得推荐的属性(特别是在处理非常大或非常小的数字时,或者当 x
和 y
的数量级不是 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 解释为百分比,而是解释为绝对值。