如何在64位(而不是任何80位寄存器)中强制所有双精度
how to force all double precision in 64-bit (and not any 80-bit registers)
我试图得到一个数值包,在两个不同的平台(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位精度,客户很高兴!)
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 本质:使用__128寄存器
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 检查是否以特定精度给出双精度
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
- C++ [链接器错误] 未定义对"执行计算(字符,双精度)"的引用
- 我可以控制调试器窗口中显示的浮点数和双精度变量的位数吗?
- 着色器中实现双精度cos()的结果是NaN,但在CPU上运行良好.出了什么问题
- 如何编写用于boost序列化的双精度包装器
- 如何在64位(而不是任何80位寄存器)中强制所有双精度