SSE: _mm_mul_ps не будет правильно умножать 10001 на 10001, но отлично работает для 10000 с 10000 - PullRequest
0 голосов
/ 13 августа 2011

У меня очень простая программа для умножения четырех чисел.Он работает нормально, когда каждый из них составляет 10000, но не делает, если я изменяю их на 10001. Результат отключается на единицу.

Я скомпилировал программу с gcc -msse2 main_sse.c -o sse на AMD Opteron и Intel Xeon и получил одинаковый результат на обеих машинах.

Буду признателен за любую помощь.Не удалось найти в Интернете ничего по этой теме.

#include <stdlib.h>
#include <stdio.h>
#include <xmmintrin.h>

int main(){

    float x[4], y[4], temp[4]; int i;  __m128 X, Y, result;

    for(i=0; i < 4; i++) { x[i] = 10000; y[i] = 10000; }

    X = _mm_load_ps(&x[0]);  Y = _mm_load_ps(&y[0]);  
    result = _mm_mul_ps(X,Y); _mm_store_ps(&temp[0], result);

    for(i=0; i < 4; i++) { x[i] = 10001; y[i] = 10001; }

    X = _mm_load_ps(&x[0]);  Y = _mm_load_ps(&y[0]);  
    result = _mm_mul_ps(X,Y); _mm_store_ps(&temp[0], result);
}

1 Ответ

10 голосов
/ 13 августа 2011

Вы работаете в пределах точности 32-разрядных чисел с плавающей точкой IEEE .

В начале есть только 23 бита дробной мантиссы плюс подразумеваемое «1». Таким образом, наибольшее целое число, которое может быть точно представлено, равно 2 24 = 16777216

Для точного представления произведения 10001 * 10001 = 100020001 требуется 27 бит.

Как только вы превысите 2 24 , вы получите только ближайшее четное число.

Как только вы превысите 2 25 , вы получите только ближайшее кратное 4.

и т. Д.

...