4

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

有任何想法吗?

4

1 回答 1

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 位精度,客户很高兴!]

于 2013-01-12T00:34:08.983 回答