以下函数比较两个数组,如果考虑到容差,所有元素都相等,则返回 true。
// Equal
template<typename Type>
bool eq(const unsigned int n, const Type* x, const Type* y, const Type tolerance)
{
bool ok = true;
for(unsigned int i = 0; i < n; ++i) {
if (std::abs(x[i]-y[i]) > std::abs(tolerance)) {
ok = false;
break;
}
}
return ok;
}
有没有办法超越这个函数的性能?
最佳答案
在循环外计算绝对值(公差)。
您可以尝试将循环展开为“主要”循环和“次要”循环,其中“次要”循环的唯一跳转是到其开头,“主要”循环具有“if”和“break”内容。做类似 ok &= (x[i]-y[i] < abstol) & (y[i]-x[i] < abstol);
的事情在小循环中以避免分支 - 注意 &
而不是&&
.
然后部分展开并矢量化小循环。然后专门针对您实际使用的任何浮点类型,并使用您平台的 SIMD 指令来执行小循环。
当然,在执行此操作之前请三思,因为它会增加代码大小,从而对可维护性产生不良影响,有时还会对系统其他部分的性能产生不良影响。
关于c++ - 检查一定范围内的公差是否相等的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695996/