C# 浮点计算在不同的处理器上会有所不同吗?(+;C和C之间的传球双打)

C# 浮点计算在不同的处理器上会有所不同吗?(+;C和C之间的传球双打),c#,c,floating-point,floating-accuracy,C#,C,Floating Point,Floating Accuracy,我有一个用C编写的应用程序,它也调用一些C代码。C#代码获取一些double作为输入,对其执行一些计算,将其传递给对其执行自己的计算的本机层,然后传递回C#层 如果我在不同的机器上运行相同的exe/DLL(所有这些机器都是Intel的x64),我得到的最终结果是否可能在不同的机器上有所不同?硬件本身都应该以相同的方式运行,假设它们实现IEEE浮点运算,我认为大多数(所有?)都是这样做的 大多数现代硬件都是标准化的,双精度的定义也是如此。您可以通过检查每个变量的内存占用情况(例如sizeof(x)

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


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

硬件本身都应该以相同的方式运行,假设它们实现IEEE浮点运算,我认为大多数(所有?)都是这样做的


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

在float.h中还应该包含一些要轮询的信息


根据我的记忆,int在一致性方面更容易出现问题。有些默认为2字节,有些默认为4字节,但您可以始终使用long来确保大小。

如果使用相同的可执行文件,结果应该是相同的。但是,值得注意的是,浮点计算通常可以通过一些持久设置(无限模式、舍入模式等)进行高度自定义。这意味着,根据当前的设置组合,同一条浮点指令可以产生不同的结果。如果应用程序确保在执行开始时将所有这些设置重置为相同的值,则结果应该相同。然而,如果这些设置中的一些没有重置,或者依赖于外部参数(如环境变量),那么在某些情况下,您可能会在不同的机器上观察到不同的结果。

有趣的问题。。。特别是那些记得原始奔腾处理器中臭名昭著的奔腾FDIV错误的人。什么样的环境变量会影响浮点计算?@opc:这将是操作系统特定应用程序加载程序以及应用程序启动代码的问题。我只是说,由于浮点计算受持久(应用程序全局)设置的影响,这些设置的初始设置很重要。它可能完全依赖于任何东西,包括环境变量。