Delphi中的浮点运算是否具有确定性?

LaK*_*ven 8 delphi floating-point precision cross-platform deterministic

Delphi中的浮点运算是否具有确定性?

我将使用与Win64编译器,OS X编译器,iOS编译器或Android编译器一样的Delphi Win32编译器编译的相同可执行文件中的相同浮点数学运算获得相同的结果吗?

这是一个至关重要的问题,因为我正在我的游戏引擎中实现多人游戏支持,我担心客户端的预测结果可能经常与服务器的确定(和权威)决定不同.

其结果是当权威游戏状态数据否决客户端侧的预测状态时,在客户端出现"滞后"或"急躁".

由于我实际上没有能力在不同的编译器上编译的不同平台上测试数十种不同的设备,而这些设备类似于"受控条件",我认为最好将这个问题提交给Delphi开发人员,看看是否有人对编译器的低级浮点确定性有内在的理解.

And*_*tyn 7

我认为没有简单的答案.这里讨论了类似的任务.通常,浮点数的表示有两个标准:IEEE 754-1985和EEE 754-2008.所有现代(实际上相当老)CPU都遵循标准,它保证了一些东西:

  • 相同标准浮动类型的二进制表示将是相同的
  • 一些操作的结果(不是全部,只有基本操作!)保证是相等的,但只有当编译器使用相同类型的命令时,我不确定它是否为真.

但是,如果使用某些扩展操作(例如平方根),即使对于不同型号的桌面CPU,结果也可能会有所不同.您可以阅读这篇文章了解一些细节:http: //randomascii.wordpress.com/2013/07/16/floating-point-determinism/

PS正如tmyklebu所提到的,平方根也是由IEEE 754定义的,因此对于Add,Subtract,Multiply,Divide和Square root的相同输入可以保证相同的结果.IEEE还定义了很少的其他操作,但是对于所有细节,最好阅读IEEE.

  • `sqrt`很好.你正在玩具有三角和指数函数的火.真正可怕的是,在x86-32上,通常使用FPU而不是SSE指令.为了获得任何类型的性能,编译器需要生成以与程序指定的方式不同的方式进行舍入的代码. (3认同)