微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

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

解决方法

我认为没有简单的答案. here讨论了类似的任务.
通常,浮点数的表示有两个标准:
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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。可能是作者故意这样做的?本文最后提供修正后的下载地址。原文如下:一、关于API Hook1.什么是API Hook不知道大家是否还记得,在DO
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都是大家转来转去,原文出处我已经找不到了。 这篇文章写的很不错,但最后部分“PermuteFunction 的终极版本”描述的不太清楚,完全按照该文章代码执行,是不行的。需要修改mess.pas中代码才行。其实文中提到的一个结构,代码中并没有使用typePIMAGE_IMPORT_DESCRIPTOR = ^IMA
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把部分api 翻译成了dephi版的 记录一下 地址 ffmpegvcl.zip
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:(dst) <--(src) 1.dst和src类型必须匹配,即必须同为字节
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂,比较少用。 2.WinExec主要运行EXE文件。如:WinExec('Notepad.exe Readme.txt', SW_SHOW); 3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。 首先必须引用shellapi
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) 参数 类型及说明 lpExistingFileName String,欲移
附带通用控件安装方法: ---------- 基本安装 1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install; 2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可; 3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可; 4
type   TRec=Record     msg:string;     pic:TMemoryStream; end; procedure TForm2.BitBtn1Click(Sender: TObject); var   ms:TMemoryStream;   Rec1,Rec2:TRec;   cc:tmemorystream;   jpg:TJPEGImage; begin   R