我正在尝试获取一个数字包以在两个不同的平台(linux 和 macos)上给出相同的结果,以排除错误/硬件问题。我怀疑当前的差异来源是不同的 64 位和 80 位 double 算法。我知道 gcc 有编译器选项来控制它,但我认为还有一个函数调用来设置它,以及可以在命令行或 shell 环境中完成的事情。
有什么想法吗?
最佳答案
好的,假设您在 x86 上,使用 float ,您应该将 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 位精度,客户很高兴!]
关于c++ - 如何在 64 位(而不是任何 80 位寄存器)中强制所有 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14287940/