SSE:_mm_mul_ps不会正确地将10001与10001相乘,但10000可以正常工作10000

时间:2011-08-12 20:26:51

标签: x86 sse simd

我有一个非常简单的程序来乘以四个数字。有用 当每个都是10000时很好但如果我将它们改为10001则没有。结果 是一个人。

我在AMD Opteron和Intel上用gcc -msse2 main_sse.c -o sse编译了程序 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 个答案:

答案 0 :(得分:10)

您正在达到IEEE 32 bit floating point numbers的精确度限制。

开头只有23位小数尾数加上隐含的“1”。 因此,可以精确表示的最大整数是2 24 = 16777216

您需要27位才能准确表示10001 * 10001 = 100020001的乘积。

一旦你超过2 24 ,你只能得到最接近的偶数。

一旦你超过2 25 ,你只得到最近的4的倍数。

等等。