точность с плавающей точкой sse2

Я написал вычисление точечного произведения двух больших векторов с плавающей точкой, используя SSE2. Но позже я заметил, что результат неправильный, но разница невелика. Ниже приведен пример странного поведения

srand(static_cast<unsigned int>(time(NULL)));
const int size = 1000;
float array[size];
int i = 0;
for (; i < size; ++i)
array[i] = rand() % 1000 / 100.;

float sum = 0.0f, ps[4];
__m128 p = _mm_setzero_ps();
for (i = 0; i < size; i += 4)
{
__m128 p0 = _mm_loadu_ps(array + i);
p = _mm_add_ps(p, _mm_mul_ps(p0, p0));
}
assert(i == size);
_mm_storeu_ps(ps, p);
sum = ps[0] + ps[1] + ps[2] + ps[3];

for (i = 0; i < size; ++i)
sum -= array[i] * array[i];

std::cout << sum << std::endl;

return 0;

Почему так?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]