【问题标题】:Does Actionscript have a math specification?Actionscript 有数学规范吗?
【发布时间】: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


【解决方案1】:

在这个意义上,Actionscript 并没有真正的数学规范。这是最接近的:

https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Math.html

它在顶部的底部写着:

根据 CPU 或操作系统使用的算法,数学函数 acos、asin、atan、atan2、cos、exp、log、pow、sin 和 sqrt 可能会导致略有不同的值。在执行所列函数的计算时,Flash 运行时会调用 CPU(或操作系统,如果 CPU 不支持浮点计算),结果会根据所使用的 CPU 或操作系统略有不同。

所以回答我们的两个问题:

它对准确性有什么看法?其实没什么它从未提及结果的不准确程度。

它对决定论有什么看法?硬件和操作系统肯定是因素,所以它是平台相关的。其他因素暂无确认。

如果你想深入了解,你就靠自己了。

【讨论】:

    【解决方案2】:

    根据the docs,Actionscript 除了intuint 类型之外,还有一个包罗万象的Number 数据类型:

    Number 数据类型使用 IEEE 二进制浮点算术标准 (IEEE-754) 指定的 64 位双精度格式。该标准规定了如何使用 64 个可用位来存储浮点数。一位用于指定数字是正数还是负数。 11 位用于存储以 2 为底的指数。其余 52 位用于存储有效位(也称为尾数),即指数所指示的幂的数字。

    通过使用它的一些位来存储指数,与使用所有位作为有效数相比,Number 数据类型可以存储大得多的浮点数。例如,如果 Number 数据类型使用全部 64 位来存储有效位,它可以存储一个大至 265 – 1 的数字。通过使用 11 位存储一个指数,Number 数据类型可以将其有效位提升为21023.

    虽然这个数字范围很大,但它是以精度为代价的。因为 Number 数据类型使用 52 位来存储有效位,所以需要超过 52 位才能准确表示的数字(例如分数 1/3)只是近似值。如果您的应用程序需要十进制数的绝对精度,请使用实现十进制浮点运算而不是二进制浮点运算的软件。

    这可能是您看到的不同结果的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多