我有一个用 C# 编写的应用程序,它也调用了一些 C 代码。C# 代码获取一些 double 作为输入,对其执行一些计算,将其传递给对其执行自己的计算的本机层,然后传递回 C# 层。
如果我在不同的机器上运行相同的 exe/dll(它们都是 Intel 的 x64),我得到的最终结果是否可能在不同的机器上会有所不同?
我有一个用 C# 编写的应用程序,它也调用了一些 C 代码。C# 代码获取一些 double 作为输入,对其执行一些计算,将其传递给对其执行自己的计算的本机层,然后传递回 C# 层。
如果我在不同的机器上运行相同的 exe/dll(它们都是 Intel 的 x64),我得到的最终结果是否可能在不同的机器上会有所不同?
如果您使用相同的可执行文件,结果应该是相同的。但是,值得注意的是,浮点计算通常可以通过许多持久设置(无穷大模式、舍入模式等)进行高度自定义。这意味着相同的浮点指令可以根据当前的设置组合产生不同的结果。如果您的应用程序确保在执行开始时将所有这些设置重置为相同的值,那么结果应该是相同的。但是,如果其中一些设置没有重置,或者依赖于外部参数(如环境变量),那么在某些情况下,您最终可能会在不同的机器上观察到不同的结果。
Most modern hardware is standardised, as is the definition of double. You can check that both are using the same type by checking the memory footprint of each variable - eg sizeof(x).
The should also be some information to poll in float.h.
From what I remember, int tends to be more problematic in consistency terms. Some default to 2 bytes, others to 4, but you could always use long to ensure sizes.
硬件本身应该都应该以相同的方式进行,假设它们实现了 IEEE 浮点运算,我认为大多数(全部?)都这样做。