检查两个向量是否相等
Checking if two vectors are equal
我有两个向量:
std::vector<double> calculatedValues = calculateValues();
std::vector<double> expectedValues = {1.1, 1.2};
我正在使用 cpputest 来验证这些向量是否相等:
CHECK_TRUE(calculatedValues == expectedValues)
这是有效的。但是,我想知道我是否不应该使用一些公差,因为毕竟我是在比较双打。
您可以将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);
要比较浮点值,您应该执行以下操作:
bool is_equal(double a, double b) {
return (abs(a-b)/b < 0.0001); // 0.00001 value can be a relative value
}
您可以调整它以比较您的向量。
是的,您应该使用一些容差,因为不能保证浮点运算在不同的 CPU 上产生完全相同的结果。例如,可能存在舍入误差。
但是,SSE/SSE2 标准确实提供了可重现的浮点数学,因此您可以考虑使用 compile 标志/ARCH:SSE2 作为替代方法。也就是说,很难确保在应用程序的任何地方都没有使用 x87 数学,所以要小心!
相关文章:
- 检查向量是否具有所有可能的字符组合
- 向量是否存在行主要形式?
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 检查两个向量是否并行的最有效方法
- 对象向量是否在堆或堆栈上分配C++?
- 检查向量是否使用除法和阻抗算法进行排序
- 包含字符串的结构的 Boost 进程间向量是否需要特殊的分配器?
- 使用 stl 迭代器封装向量是否很好?如果是?怎么可能呢?
- 检查给定向量是否已经包含 C++ 中的 pair 元素
- 检查向量是否在某个位置未初始化
- 在此示例中,向量是否复制了两次
- 如何检查向量是否包含指定索引中的特定字符
- 向量是否在push_back()上重新创建所有对象
- 向量是否知道在由一对迭代器初始化时首先保留?
- 检查字符串向量是否是其中一个元素中的子字符串
- 检查布尔(范围)的向量是否等于1和0的序列
- 快速紧凑的方式来检查向量是否是二进制的
- C++检查向量a是否包括向量b的元素
- 预分配向量是否更有效
- 确定两个向量是否包含两个相同的相邻项