浮点计算在不同处理器上会有所不同吗?(+在 C# 和 C 之间传递双精度数)

StackOverflow https://stackoverflow.com/questions/2335529

我有一个用 C# 编写的应用程序,它也调用一些 C 代码。C# 代码获取一些双精度值作为输入,对其执行一些计算,将其传递到本机层,由本机层对其执行自己的计算,然后传回 C# 层。

如果我在不同的机器上运行相同的exe/dll(它们都是Intel的x64),我得到的最终结果是否有可能在不同的机器上有所不同?

有帮助吗?

解决方案

如果您使用相同的可执行文件(多个)的结果应该是相同的。然而,值得注意的是,浮点运算通常由多个持久设置(无穷模式下,舍入模式等)高度可定制的。这意味着相同的浮点指令可以根据当前的设置组合产生不同的结果。如果您的应用程序确保所有这些设置被重置为在开始执行相同的值,那么结果应该是相同的。但是,如果某些设置不复位,或依赖于外部参数(如环境变量),那么在某些情况下,你可能最终在不同机器上观察不同的结果。

其他提示

硬件本身都应该都应该做同样的方式,假设他们实现IEEE浮点运算,而我想大多数(全部?)做的。

http://en.wikipedia.org/wiki/IEEE_754-2008

大多数现代硬件都是标准化的,双精度的定义也是如此。您可以通过检查每个变量的内存占用来检查两者是否使用相同的类型 - 例如 sizeof(x)。

float.h 中还应该有一些要轮询的信息。

据我所知, int 在一致性方面往往存在更多问题。有些默认为 2 个字节,有些默认为 4 个字节,但您始终可以使用 long 来确保大小。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top