加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:03:06 所属栏目:百科 来源:网络整理
导读:我试图获得一个数字包,以便在两个不同的平台( 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 %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位精度,客户很高兴!]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读