一尘不染

浮点误差的确定性如何?

c#

我知道浮点计算存在准确性问题,并且有很多问题会解释原因。我的问题是,如果我两次运行相同的计算,是否可以始终依靠它来产生相同的结果?哪些因素可能会影响这一点?

  • 计算之间的时间?
  • CPU的当前状态?
  • 不同的硬件?
  • 语言/平台/操作系统?
  • 太阳耀斑?

我有一个简单的物理模拟,想录制会议,以便可以重播。如果可以依靠计算,那么我只需要记录初始状态以及任何用户输入,我就应该始终能够准确地再现最终状态。如果计算结果不准确,则在仿真开始时,错误可能会产生重大影响。

我目前在Silverlight工作,但很想知道这个问题是否可以普遍回答。

更新: 最初的答案表示是,但是显然,正如所选答案的注释中所讨论的那样,这并不完全清楚。看来我将不得不做一些测试,看看会发生什么。


阅读 304

收藏
2020-05-19

共1个答案

一尘不染

据我了解,只要您使用相同的指令集和编译器,并且所运行的任何处理器都严格遵守相关标准(即IEEE754),就可以保证获得相同的结果。也就是说,除非您要处理一个特别混乱的系统,否则运行之间的计算中的任何漂移都不太可能导致错误的行为。

我知道的特定陷阱:

  1. 某些操作系统允许您以破坏兼容性的方式设置浮点处理器的模式。

  2. 浮点中间结果通常在寄存器中使用80位精度,而在存储器中仅使用64位精度。如果以改变函数中寄存器溢出的方式重新编译程序,则与其他版本相比,它可能会返回不同的结果。大多数平台都会为您提供一种强制将所有结果都截断为内存精度的方法。

  3. 标准库功能可能会在版本之间更改。我发现在gcc 3 vs 4中有一些并不少见的例子。

  4. IEEE本身允许某些二进制表示形式有所不同……特别是NaN值,但我不记得详细信息。

2020-05-19