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