我是否仍需要使用定点数来保证计算机在数学运算中获得相同的结果?


9

有人告诉我,大多数现代计算机遵循相同的浮点标准,这是否意味着如果输入相同,对于给定的数学运算,它们都将获得相同的浮点答案?

我之所以问是因为我正在研究在网络上制作RTS游戏,并且同步数百个单位的位置听起来是一种不好的方法。

因此,如果我仅发送输入,则需要确保所有客户端通过从这些输入运行模拟来获得相同的结果。

我读到较旧的RTS游戏使用定点算法,但是我不知道现代计算机是否都遵循相同的标准?我还被告知,尽管不精确,但对于相同的输入,浮点数的结果是确定的(我想这意味着遵循相同标准的任何计算机都会得到相同的不精确结果吗?)。

即使计算机遵循相同的浮点标准,仍然存在偏差吗?

我用C#编写游戏,但不确定是否重要,以为我还是会提到它。


即使他们这样做,我也不会为此使用浮动广告
Telastyn

你什么意思 ?为什么不?
WDUK

无论如何,不​​希望使用浮动控件,因为行为可能取决于地图上的位置。Minecraft的《遥远的土地》是一个更著名的例子:当您远离生成点时,移动,渲染和地形生成会出现毛刺。
阿蒙(Amon)

Answers:


18

即使计算机遵循相同的浮点标准,仍然存在偏差吗?

不幸的是,是的,尤其是当您使用C#(或其他JIT编译语言)时。这里发生的问题是,在某些处理器体系结构上的JIT编译阶段生成的代码使用的CPU寄存器比在其他体系结构上更多。这可能导致在某些机器上对某些操作使用扩展的浮点精度,而在其他机器上则不使用这种情况。这意味着对于使用双精度的每次迭代计算,都有机会产生不同的累积舍入误差。

那不是一个假设的问题,我对现代工程仿真软件或多或少的现代硬件中的此类偏差有第一手的经验。这个问题使得很难为复杂的浮点计算创建可靠的回归测试,从而在所有涉及的机器上产生完全相同的结果。


这个。某些根本原因:IEEE Std 754包括可选的“ should”子句(例如,NaN处理)并允许设计替代方案(例如,下溢检测)。就语言绑定支持浮点标准而言,它们在评估浮点表达式时(例如FLT_EVAL_METHOD在ISO C / C ++中)仍可能为编译器留出空间。超越函数(例如sinexplog)在很大程度上是由IEEE浮点标准和编程语言标准既不受调控。简单的库版本升级(例如新glibc版本)可能导致结果不同。
njuffa

我自己在游戏中击中了它。火箭在我的笔记本电脑上飞行良好,无法在我的台式机上飞行,安装完全相同。
罗兰·佩希特尔

3

浮点错误

每个浮点数在用于计算时都会累积不精确性。这是使用不精确格式进行计算的简单事实。计算对计算顺序也很敏感,不能保证可交换性,即:(a + b) + c可能与可能不相同a + (b + c)

另外,处理器的尾数长度不必与存储标准相同。由于32/64/128位浮点数偶尔会像具有更多位一样工作,因此这会产生有趣的行为。

定点错误

就是说定点算术也会累积误差。区别在于,定点数清楚地表明损失了哪种精度,并且取决于选择的操作,可以完全避免舍入误差。它们也是可交换的(a + b) + c = a + (b + c)

哪一个?

使用哪一个完全取决于您需要的属性。

浮点数字:

  • 给出了广泛的值,这些值变得非常细密,并且在极端时逐渐分开。
  • 对计算顺序敏感
  • 随着时间的推移会累积舍入误差。
  • 由于硬件/内存浮动大小不匹配,可能会出现不稳定的行为。

定点数:

  • 给出较小范围的数字,并且任意两个连续数字之间的距离相同。
  • 对计算顺序不太敏感
  • 更清楚的舍入错误
  • 可与最小化/避免舍入问题一起使用。

1
“定点数很清楚什么精度丢失” -浮点是太清楚,不同的是,而固定点的不准确是更直观的普通生活的编号
whatsisname

1
因此,只有定点保证所有计算机,无论硬件如何,都会遭受相同的错误/精度损失?
WDUK

1
从本质上讲,是的,因为您可以指定固定点号为32或64位,并且它们将出现在所有系统上。浮点数可以是32位或64位,但是硬件实际上可以使用48位或96位进行计算,最后转换为32位或64位,从而导致不同类型的硬件之间存在差异。
user1118321

@whatsisname虽然浮点规范非常清楚,但是您不能轻易告诉我在此总和中会遇到哪些舍入问题(a + b * c) / d - e。除明显的问题(如NaN,除以零或上溢/下溢)外,此表达式可能不正确。此外,就精度而言,内存和寄存器之间的障碍甚至是从内存中“相同”浮点值的简单加载/存储都将改变答案。
Kain0_0

@ Kain0_0:您是对的,因为我不是浮点专家,所以我不能轻易告诉您我将会遇到什么。这就是我说“对普通生命编号更直观”时的意思。当您说定点是“清晰的”而浮点不是“清晰”时,您听起来好像浮点数似乎是随机不准确的。
whatsisname

-1

存在一个问题,为什么您要保证相同的结果,因为相同的结果根本不能保证您的结果有用

您可能有一个数值不稳定的算法,可以在不同的计算机上给出两个相同但完全没有意义的结果。如果存在差异,但结果在13位数以内相同,那就值得信赖了。

在极少数情况下,可重现性非常重要:在布局引擎中或无损压缩/解压缩。使用定点很可能会被误导。


我没有拒绝您的回答,但是OP所描述的情况似乎恰好是“可再现性非常重要的少数情况之一”。在RTS游戏中,较小的舍入误差可以使“两个对象发生碰撞”之间的差异有所不同。
布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.