如何确保在 windows 和 linux 上具有相同的浮点行为?

Posted

技术标签:

【中文标题】如何确保在 windows 和 linux 上具有相同的浮点行为?【英文标题】:How to ensure same floating-point behavior on windows and linux? 【发布时间】:2018-03-21 15:43:33 【问题描述】:

我有一个对双精度数进行大量计算的软件,它必须在 linux 和 windows 上运行。我不关心使用什么行为(越快越好),但我必须在两个平台上获得相同的结果。

我正在 Windows 10 上使用 x86_64-w64-mingw32 gcc 版本 4.9.2 进行编译。 以及 xubuntu 上的 x86_64-linux-gnu gcc 4.9.3。

我尝试过使用以下编译选项: -基础数学 -fno-rounding-math -float-存储 在这两个系统上,似乎没有任何工作。

我对浮点表示的复杂性有所了解,但对于必须跨平台的软件强制执行相同的行为真的那么难吗?

【问题讨论】:

“似乎没有任何效果”。你能显示一些代码吗? 究竟有什么不同? 如果您的所有平台都使用 ieee 754,不妨试试checking Cross Platform Floating Point Consistency的可能重复 您是否调用了任何数学库例程,例如sinlog?除了浮点之外,您的程序中是否有任何多线程或其他非确定性行为? 【参考方案1】:

要具有相同的行为,至少您必须:

1- 标准化你的类型,不要从 double 切换到 long double 例如,仅使用唯一类型 long double 2-如果您有任何常量,请使用与您的类型相关的浮点文字:

如果你选择 long double,你的常量必须有后缀 l 或 L 例如:0.5L

【讨论】:

我只使用 double 并且我从文件中获取我处理的所有数据,所以没有常量 这个答案还不够。浮点行为的差异源于编译器选择使用更高的精度(例如,即使操作数的类型为double,也使用long double 计算)、编译器收缩表达式(将a*b+c 替换为fma(a, b, c))等获得浮点运算许可证。此外,如果一个程序是多线程的或在其执行中具有其他不确定性,则浮点结果可能会有所不同。回答这个问题需要解决特定的编译器特性。 我需要 8-9 位精度,出现的第一个不一致是在 10^-6 您必须跟踪您在程序中注意到不一致开始的位置。这将是由于特定的计算或用户定义的函数。否则尝试 long double 并注意第一个不一致,它应该小于 10 位精度 第一个不一致发生在 12-13 位上,但经过 300 次迭代后,我的最终结果有 15% 的差异(近似错误导致程序在不同系统上的不同时间进入 if 语句)。我需要 10^-6 的精度。一个

以上是关于如何确保在 windows 和 linux 上具有相同的浮点行为?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows 10安装和使用Linux的Bash shell

linux怎样和windows上的IP 互ping 啊

Nuget 包引用库在 Linux 和 Windows 上具有不同的名称

寻找想法以确保在 git 存储库中将文件权限设置为 chmod 777

如何在Windows下构建ARM Linux QT开发环境

如何在Windows系统上利用Telnet协议连接Linux服务器