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