检查两个向量是否相等
Checking if two vectors are equal
我有两个向量:
std::vector<double> calculatedValues = calculateValues();
std::vector<double> expectedValues = {1.1, 1.2};
我正在使用 cpputest 来验证这些向量是否相等:
CHECK_TRUE(calculatedValues == expectedValues)
这是有效的。但是,我在想我是不是应该使用一些公差,因为我毕竟是在比较doubles。
是的,您应该使用一些容差,因为不能保证浮点运算在不同的 CPU 上产生完全相同的结果。可以有例如舍入误差。
但是,SSE/SSE2 标准确实提供了可重现的浮点数学运算,因此您可以考虑使用编译标志 /ARCH:SSE2 作为替代方案。也就是说,很难确保应用程序中的任何地方都没有使用 x87 数学,所以要小心!
要比较浮点值,您应该这样做:
bool is_equal(double a, double b) {
return (abs(a-b)/b < 0.0001); // 0.00001 value can be a relative value
}
您可以调整它来比较您的向量。
您可以将 std::equal()
与自定义 epsilon 一起使用,而不是 operator==
:
bool equal = std::equal(calculatedValues.begin(), calculatedValues.end(), expectedValues.begin(),
[](double value1, double value2)
{
constexpr double epsilon = 0.01; // Choose whatever you need here
return std::fabs(value1 - value2) < epsilon;
});
CHECK_TRUE(equal);
我有两个向量:
std::vector<double> calculatedValues = calculateValues();
std::vector<double> expectedValues = {1.1, 1.2};
我正在使用 cpputest 来验证这些向量是否相等:
CHECK_TRUE(calculatedValues == expectedValues)
这是有效的。但是,我在想我是不是应该使用一些公差,因为我毕竟是在比较doubles。
是的,您应该使用一些容差,因为不能保证浮点运算在不同的 CPU 上产生完全相同的结果。可以有例如舍入误差。
但是,SSE/SSE2 标准确实提供了可重现的浮点数学运算,因此您可以考虑使用编译标志 /ARCH:SSE2 作为替代方案。也就是说,很难确保应用程序中的任何地方都没有使用 x87 数学,所以要小心!
要比较浮点值,您应该这样做:
bool is_equal(double a, double b) {
return (abs(a-b)/b < 0.0001); // 0.00001 value can be a relative value
}
您可以调整它来比较您的向量。
您可以将 std::equal()
与自定义 epsilon 一起使用,而不是 operator==
:
bool equal = std::equal(calculatedValues.begin(), calculatedValues.end(), expectedValues.begin(),
[](double value1, double value2)
{
constexpr double epsilon = 0.01; // Choose whatever you need here
return std::fabs(value1 - value2) < epsilon;
});
CHECK_TRUE(equal);