This Flash game有很多玩家,包括我和一些朋友。我们注意到,对于不同的人,同样的事情可以运行不同的方式。模拟中的数学问题绝对是罪魁祸首。原因是否在硬件、操作系统、浏览器、32位/64位等方面尚不清楚。但是对于我们必须测试的组合,我们已经从相同的模拟开始条件中获得了5个不同的最终结果,并且可能会得到更多。
这让我想知道,有没有浮点数学规范?如果有,它对计算的准确性和确定性有什么规定?
我将其与Java进行比较,后者使用Math
类区分常规浮点运算,而使用StrictMath
类和strictfp
关键字区分确定性浮点运算。两者总是在精确结果的1ULP内,这也意味着对于单个操作或函数调用,常规数学和严格数学总是给出彼此在1ULP内的结果。文档对此非常清楚。我希望其他受人尊敬的语言也有类似的东西,说明它们的浮点计算有多准确,以及它们是否在任何地方都给出相同的结果。
自从一些人说这个游戏是不诚实的以来,更新:
其他一些人已经拆解了swf,甚至为它制作了mod,他们已经看到了游戏引擎,可以确认没有随机性。Box2d用于它的物理特性。如果一个设计在随后的运行中确实有不同的运行,它实际上由于一些bug而改变了,通常这是一个明显的不同,但如果没有,你可以用this tool检查原始数据,看看它是不同的。正如预期的那样,不同的启动条件会得到不同的最终结果。
至于我们到目前为止所知道的,这是测试级别的结果:
例如,如果我在桌面上运行32位Chrome (AMD A10-5700作为CPU),我总是会得到"946 ticks“的结果。但如果我在Firefox或Internet Explorer上运行,我总是得到"794个滴答“的结果。
发布于 2018-06-11 20:13:38
在这种意义上,Actionscript并没有真正的数学规范。这是你能得到的最接近的结果:
https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Math.html
它在顶部的底部写着:
根据
或操作系统使用的算法,数学函数acos、asin、atan、atan2、cos、exp、log、pow、sin和sqrt可能会产生略微不同的值。执行所列函数的计算时,Flash运行时会调用CPU (如果CPU不支持浮点计算,则调用操作系统),结果会根据所使用的CPU或操作系统而略有不同。
所以来回答我们的两个问题:
关于准确性,它是怎么说的?实际上,没什么。在任何时候,它都没有提到结果可以有多不准确的限制。
关于决定论,它说了些什么?硬件和操作系统肯定是因素,所以它是依赖于平台的。没有确认其他因素。
如果你想看得更深一些,你只能靠自己了。
发布于 2018-06-15 04:05:08
根据the docs的说法,除了int
和uint
类型之外,Actionscript还有一个通用的Number
数据类型:
IEEE数据类型使用由
二进制浮点算术标准(IEEE754)指定的64位双精度格式。该标准规定了如何使用64个可用位来存储浮点数。一位用于指定数字是正数还是负数。11位用于指数,以2为基数存储。其余52位用于存储有效数(也称为尾数),即指数表示的幂的数字。
通过使用Number数据类型的一些位来存储指数,Number数据类型可以存储的浮点数比它使用所有位作为有效数时要大得多。例如,如果Number数据类型使用全部64位来存储有效数,则它可以存储多达265 - 1的数字。通过使用11位来存储指数,number数据类型可以将其有效数提高到21023的幂。
虽然这个数字的范围很大,但它是以精度为代价的。由于Number数据类型使用52位来存储有效数,因此需要52位以上才能精确表示的数字(例如分数1/3 )只是近似值。如果您的应用程序需要十进制数的绝对精度,请使用实现十进制浮点运算的软件,而不是二进制浮点运算。
这可以解释你所看到的不同的结果。
https://stackoverflow.com/questions/50769210
复制相似问题