这个问题的答案还取决于你是否想要实际的不平等,你会使用@PaulR 所显示的内容:
bool fneq128_a (__m128 const& a, __m128 const& b)
{
// returns true if at least one element in a is not equal to
// the corresponding element in b
return _mm_movemask_ps(_mm_cmpeq_ps(a, b)) != 0xF;
}
或者您是否想使用一些 epsilon 来指定元素在不超过阈值的情况下仍被视为“相等”:
bool fneq128_b (__m128 const& a, __m128 const& b, float epsilon = 1.e-8f)
{
// epsilon vector
auto eps = _mm_set1_ps(epsilon);
// absolute of difference of a and b
auto abd = _mm_andnot_ps(_mm_set1_ps(-0.0f), _mm_sub_ps(a, b));
// compare abd to eps
// returns true if one of the elements in abd is not less than
// epsilon
return _mm_movemask_ps(_mm_cmplt_ps(abd, eps)) != 0xF;
}
例子:
auto a = _mm_set_ps(0.0, 0.0, 0.0, 0.0);
auto b = _mm_set_ps(0.0, 0.0, 0.0, 1.e-15);
std::cout << fneq128_a(a, b) << ' ' << fneq128_b(a, b) << "\n";
打印:
1 0