我有一个非常简单的程序来乘以四个数字.它们每个都是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);
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ing 10
您正在达到IEEE 32位浮点数的精度限制 .
开头只有23位小数尾数加上隐含的"1".因此,可以精确表示的最大整数是2 24 = 16777216
您需要27位才能准确表示10001*10001 = 100020001的乘积.
一旦你超过2 24,你只能得到最接近的偶数.
一旦你超过2 25,你只能获得最接近的4的倍数.
等等.