【问题标题】:Is Double Math Consistent across Multiple Platforms?双数学在多个平台上是否一致?
【发布时间】:2015-02-10 02:42:56
【问题描述】:

对于我的确定性物理引擎,我需要确认在 C# 中使用双精度的计算在多个平台上足够一致。有谁知道以下功能的结果有多大不同?在我的计算机上作为 Windows 32 位应用程序,这些是结果(注意:伪代码):

double x = 123.123;
x * 2 = 246.246
Math.Pow (x, 2) = 15159.273129
Math.Sqrt (x) = 11.0960803890383
Math.Sin (x) = -0.56537391969734

我仍然不知道是否会在其他平台或其他语言上出现相同的结果(我使用的是 C#)。如果需要更多信息,我会尽快提供。如果有人有知识或有时间帮助测试其他平台上的计算,请帮助我克服这种不确定性。

【问题讨论】:

标签: double cross-platform precision floating-accuracy deterministic


【解决方案1】:

C# 标准ECMA-334 在第 11.1.6 节浮点类型中说“浮点运算可以以比运算结果类型更高的精度执行。”。

鉴于这种规则,您无法确保在任何地方都能得到完全相同的答案。 “可以”表示某些实现可能使用比其他实现更高的精度,以进行相同的计算。

即使测试表明所有当前实现在一系列输入中的所有计算都得到相同的答案,但任何平台上的下一个编译器版本都可能会改变这一点。如果你真的需要相同的结果,你需要选择一个承诺相同结果的库或类似的库。

计算对输入的微小变化的敏感程度各不相同。极端情况是对某些物理系统(例如天气)的模拟,其中输入的微小变化可能会扩展为结果的巨大变化。

了解模拟行为的一种方法是故意扰乱某些值,例如1e15 中的一部分。这是否足以改变结果?但是,始终存在某些输入会导致条件不如其他输入稳定的风险。

【讨论】:

  • 哦,谢谢你的信息。我只需要足够的准确性,因为差异不明显。计算结果的最大差异是多少?我只需要它对于视频游戏来说足够准确。
  • 这将在很大程度上取决于您正在执行的计算。
  • 您认为上面列出的计算可以吗?我估计在一场比赛中每个人大约有 7,200,000 人。
  • 这不是个别计算的问题,而是程序的整体效果和算法的性质。除了加减法,你可能会遇到麻烦。
  • 我知道我可能应该选择一种更可靠的方法,但如果可以,我宁愿使用最简单的方法。你知道我可以四舍五入到小数点后第三位而忘记准确性吗?如果没有,您对更确定的数学有什么建议吗?非常感谢到目前为止的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2012-08-03
  • 2015-03-05
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多