1

我正在编译使用线性代数计算色谱的遗留代码。矩阵使用 float 作为类型,所有计算都使用 float。当我们使用旧的编译器(turbo-linux gcc 2.95)时,我们会得到一个答案。当我使用我们的新编译器(SuSE gcc 4.3.2)时,我们会得到不同的光谱。

我需要获取使用新编译器编译的同一程序的输出,以匹配使用旧编译器的输出。

我试过使用这些编译器选项: g++ -g -lstdc++ -mfpmath=no-sse -mno-sse -mno-sse2 -ffloat-store -mieee-fp

这个代码:

volatile unsigned short int cw;
__asm__ volatile("fstcw %0" : "=m" (*&cw));
printf("floating point control word was: %x\n",cw);
cw=0x027f;
__asm__ volatile("fldcw %0" :: "m" (*&cw));
    printf("floating point control word  now is: %x\n",cw);

这些都不能使色谱匹配。

那么问题是......是否有灵丹妙药可以使从两个不同编译器编译的代码产生的色谱相匹配?我希望浮点控制宽度(上面的 flpcw)是解决方案,但事实并非如此。(注意,代码太复杂,无法发布,)。

PS上面代码的结果是:gcc 2.95浮点控制字是:0x37f浮点控制字现在是0x27f。

gcc 4.3.2 浮点控制字是:0x37f 浮点控制字现在是 0x27f。

4

0 回答 0