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位精度,客户很高兴!] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |