【发布时间】:2018-06-08 22:35:10
【问题描述】:
This Flash game有很多玩家,包括我和一些朋友。我们注意到对于不同的人,同样的事情可能会以不同的方式运行。模拟中的数学绝对是罪魁祸首。原因是否在硬件、操作系统、浏览器、32 位/64 位等方面尚不清楚。但是对于我们必须测试的组合,我们已经从相同的模拟开始条件中获得了 5 个不同的最终结果,并且可能会得到更多。
这让我想知道,Actionscript 有浮点数学规范吗?如果有,它对计算的准确性和确定性有何看法?
我与 Java 进行比较,Java 区分了带有 Math 类的常规浮点数学和带有 StrictMath 类和 strictfp 关键字的确定性浮点数。两者总是在精确结果的 1 ulp 内,这也意味着对于单个操作或函数调用,常规数学和严格数学总是给出彼此在 1 ulp 内的结果。文档对此非常清楚。我希望其他受人尊敬的语言也有类似的东西,说明它们的浮点计算有多准确,以及它们是否在任何地方给出相同的结果。
更新,因为有些人一直在说游戏不诚实:
其他一些人已经拆解了 swf 甚至为它制作了模组,他们已经看到了游戏引擎并且可以确认没有随机性。 Box2d 用于它的物理特性。如果一个设计在随后的运行中确实出现了不同的运行情况,它实际上由于一些错误而发生了变化,通常这是一个明显的差异,但如果不是,您可以使用this tool 检查原始数据并查看它是否不同。预期的不同起始条件会得到不同的最终结果。
就我们目前所知,这是测试级别的结果:
例如,如果我在我的桌面上运行 32 位 Chrome(AMD A10-5700 作为 CPU),我总是会得到“946 ticks”的结果。但如果我在 Firefox 或 Internet Explorer 上运行,我总是得到“794 ticks”的结果。
【问题讨论】:
-
游戏可能有一点不诚实,可能在其模拟中添加了一些随机的东西。也有可能模拟不准确,除非有一个保存/加载传输确实以所需的精度存储所有对象(无论游戏中使用什么坐标)。确实没有足够的数据来说明 Flash 数学,因为它在不同的系统上提供不同的结果,但如果 Flash 使用本机调用来乘以浮点数,它肯定会发生。
标签: actionscript-3 floating-point specifications deterministic