Delphi中的浮点运算是否具有确定性?
I.E.我将使用Delphi Win32编译器编译的相同可执行文件中的相同浮点数学运算得到相同的结果,就像我使用Win64编译器,OS X编译器,iOS编译器或Android编译器一样?
这是一个至关重要的问题,因为我正在我的游戏引擎中实现多人游戏支持,我担心客户端的预测结果可能经常与服务器的确定(和权威)决定不同.
其结果是当权威游戏状态数据否决客户端侧的预测状态时,在客户端出现“滞后”或“急躁”.
由于我实际上没有能力在不同编译器上编译的不同平台上测试数十种不同的设备,而这些设备类似于“受控条件”,我认为最好将这个问题提交给Delphi开发人员,看看是否有人对编译器的低级浮点确定性有内在的理解.
解决方法
我认为没有简单的答案.
here讨论了类似的任务.
通常,浮点数的表示有两个标准:
IEEE 754-1985和EEE 754-2008.
所有现代(实际上很老)的cpu都遵循标准,它保证了一些东西:
通常,浮点数的表示有两个标准:
IEEE 754-1985和EEE 754-2008.
所有现代(实际上很老)的cpu都遵循标准,它保证了一些东西:
>相同标准浮动类型的二进制表示将是相同的
>一些操作的结果(不是全部,只有基本操作!)保证是相等的,但只有当编译器使用相同类型的命令时,我不确定它是否为真.
但是,如果使用某些扩展操作(例如平方根),即使对于不同型号的桌面cpu,结果也可能会有所不同.您可以阅读这篇文章了解一些细节:
http://randomascii.wordpress.com/2013/07/16/floating-point-determinism/
附:正如tmyklebu所提到的,平方根也是由IEEE 754定义的,因此对于Add,Subtract,Multiply,Divide和Square root的相同输入可以保证相同的结果. IEEE还定义了很少的其他操作,但是对于所有细节,最好阅读IEEE.