Ответ на этот вопрос также зависит от того, хотите ли вы иметь фактическое неравенство, в котором вы будете использовать что-то в соответствии с тем, что показало @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;
}
или вы хотите использовать некоторые эпсилоныукажите, что элементы по-прежнему считаются «равными», если они не отличаются больше порогового значения:
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