c++ - 如何在 64 位(而不是任何 80 位寄存器)中强制所有 double

标签 c++

我正在尝试获取一个数字包以在两个不同的平台(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/

相关文章:

c++ - printf 使 setrlimit 不起作用

.net - map 和字典的实现差异

c++ - 类型安全和 NEG 指令

c++ - wxWidgets ListView 标题不显示

c# - 同一台机器上的两个程序相互通信的最佳方式是什么

c++ - 错误处理方法的首选方法

c++ - 从 Eigen::Vector 转换为 Eigen::Affine3f

c++ - boost::asio 在使用成员接受器而不是新接受器时崩溃

c++ - 将新节点添加到具有两个类的链表

c++ - 调试到 MFC header 代码不适用于 Visual Studio 2019