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

how to force all double precision in 64-bit (and not any 80-bit registers)

本文关键字:寄存器 双精度 80位 任何 64位      更新时间:2023-10-16

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

任何想法?

好的,假设您是在x86上,使用浮点数,您应该将x87寄存器FCW中的9-8位设置为10b。(出于某种原因,这也是Windows的默认设置)。

像这样的东西应该在gcc中工作:

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

[几年前我工作的地方,有人抱怨他们的新电脑在浮点运算方面不如旧电脑好,并给了我一份两台电脑的二进制结果转储。我有一台与客户的旧电脑相似的电脑和一台与新电脑相似的电脑,我无法让它们有什么不同——直到我意识到一台电脑运行的是windows系统,另一台没有,所以在非windows系统的电脑上,浮点运算结果"更好"。在我给客户一段与上面非常相似的代码之后,但是将8位和9位都设置为80位精度,客户很高兴!)