如何在64位(而不是任何80位寄存器)中强制所有双精度

时间:2013-01-11 22:50:45

标签: c++

我试图获得一个数字包,在两个不同的平台(linux和macos)上提供相同的结果,以排除错误/硬件问题。我怀疑当前的差异来源是64位与80位双精度算法不同。我知道有gcc的编译器选项来控制它,但我认为还有一个函数调用来设置它,以及可以在命令行或shell环境中完成的事情。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好的,假设你在x86上,使用浮点,你应该将x87寄存器FCW中的第9-8位设置为10b。 [这也是Windows出于某种原因默认执行的操作]。

这样的东西应该在gcc中起作用:

void set_fp_mode()
{
    short mode;
    __asm__ __volatile__ ("fstcw %0\n"
               "andw   $0xFEFF, %0\n"       // Clear bit 8. 
               "orw    $0x200, %0\n"        // just to be safe, set bit 9.
               "fldcw %0\n" : : "m" (mode));
}

[我几年前工作过的时候,有人抱怨说他们的新电脑不像旧电脑一样擅长浮动点,并且给了我两个二进制结果的转储。我有一台类似的计算机给客户旧计算机和一台新计算机,我无法让它变得与众不同 - 直到我意识到一台机器正在运行Windows,另一台机器不运行,所以浮动点结果更好"在非Windows机器上。在我给客户提供了与上面相似的代码之后,但是将第8位和第9位设置为80位精度,客户很高兴!]