Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 整数乘法模2³²;在动作脚本3中_Actionscript 3_Actionscript_Language Lawyer - Fatal编程技术网

Actionscript 3 整数乘法模2³²;在动作脚本3中

Actionscript 3 整数乘法模2³²;在动作脚本3中,actionscript-3,actionscript,language-lawyer,Actionscript 3,Actionscript,Language Lawyer,有没有人遇到过关于int和uint上的算术如何在Actionscript 3中工作的权威规范?(我所说的“权威”是指“来自Adobe”或“已被Adobe宣布为权威”)。特别是,我正在寻找一种受支持的方法来进行模232的整数乘法。我所能找到的任何Adobe文档都没有涉及到这一点 Actionscript声称基于ECMAScript,但ECMAScript根本不做整数运算。它在IEEE-754上做的每件事都是双倍的,并且在按位运算之前减少了模232的结果,在大多数情况下模拟整数运算。但是,这不适用于

有没有人遇到过关于int和uint上的算术如何在Actionscript 3中工作的权威规范?(我所说的“权威”是指“来自Adobe”或“已被Adobe宣布为权威”)。特别是,我正在寻找一种受支持的方法来进行模232的整数乘法。我所能找到的任何Adobe文档都没有涉及到这一点

Actionscript声称基于ECMAScript,但ECMAScript根本不做整数运算。它在IEEE-754上做的每件事都是双倍的,并且在按位运算之前减少了模232的结果,在大多数情况下模拟整数运算。但是,这不适用于乘法:乘法的真实结果(例如0x10000001*0x0FFFFFFF)对于double的尾数来说太长,因此如果按照规范执行,则低阶位将丢失

现在输入Actionscript。我在实验中发现,将两个
int
uint
变量相乘,然后立即将乘积转换为
int
uint
似乎总能给出准确的结果。然而,生成的AVM2字节码只包含一条普通的“mul”指令,没有直接指示它应该生成整数结果而不是浮点结果;虚拟机必须向前看才能发现这一点。我担心我只是在实验中幸运地获得了额外的精度作为奖励,而不是我可以依赖的东西

(首先,我的实验都是使用x86 Flash播放器进行的。也许它将中间结果表示为Intel 80位双倍运算,或者在计算堆栈上存储64位int,直到知道它将用于什么。在没有本机32×32的非x86平板电脑上,这两种方法都不容易实现。)→64乘法指令,那么VM是否可以决定将精度降低到ECMAScript标准指定的精度?)

24小时状态:迈克·威尔士做了一些有说服力的调查,并提供了非常有用的链接,但不幸的是,这还不足以解决这个问题。还有其他人吗


(tl;dr Difference in comments:whitequark在某种程度上驳斥了我关于答案可能是“否”的假设原因之一。他的观点有其价值,但当然并不构成答案是“是”的证据。)

ActionScript 3基于ECMAScript 4,其中包括真正的32位int和uint操作。例如,
multipy\u i
指令执行整数乘法(源代码:)

不幸的是,Adobe AS编译器似乎只执行这些操作码的浮点版本,例如,
乘法
,它假定将操作数强制转换为64位浮点。这可能与的状态一致,即ints将在数学运算期间提升为双倍,以便处理溢出。如果它确实执行64位浮点乘法,然后将其转换回整数,那么应该会丢失精度

尽管如此,Flash播放器在立即返回int时似乎不会失去精度。例如:

var n:int = 0x7FFFFFFF;
var n2:int = n*n;
trace(n2);
即使此代码发出
乘法
指令,它也会在Flash Player中找出1,如果精度没有损失,则会得到1。目前尚不清楚这种行为是否是一致的和跨平台的。然而,我在几个平台(包括一些手机)上用Flash Player对其进行了测试,结果似乎一致为1。但是,在解释模式下运行此代码会输出一个0!(JIT模式仍然输出1,因此此行为一定是JIT的副作用)。因此,依赖这一点可能有风险


使用
multiply_i
操作码应该可以正常工作。使用ints时将使用此操作码。也可用于应用此操作码。

大多数(如果不是全部的话)非x86平板电脑都基于ARM,而且有这样一个。我明白了。那么,给他们更多的权力。不幸的是,这只会增加这样的风险:我的代码现在看起来可以工作,但在未来某个不确定的时刻,当一个不同的体系结构变得流行时,就会开始失败。事实上不是这样。闪存足够重,只能在32位或更好的体系结构上运行,现在和将来每一个合理的32位arch都会有这种倍增。即使是最便宜的也可以!此外,如果某个CPU不支持此功能,而Flash将在其上运行,编译器将提供一个支持函数,就像它目前对除法所做的那样,您不会注意到任何事情。您假设我的问题的答案是,“是的,Flash保证此功能可以工作”。这个保证正是我要寻找的参考。好吧,我评论的第一部分仍然适用:你永远找不到这样一个平台。关于第二个,是的,我一辈子都没有用过闪光灯;这就是我为什么要评论而不回答的原因。我在哪里可以阅读ECMAScript 4规范?谷歌提供了一些概述文章,但没有实际的规范文本。此外,为什么AVM2反汇编程序会将乘法_i指令显示为简单乘法?然而,我在上找到了一个缓存副本,它只是通过引用ECMA-262来指定乘法(在第4.3.10节,参见14.16.4),ECMA-262将乘法定义为IEEE double独占(ECMA-262 v3第11.5.1节)。如果没有更具体的参考资料,我很难相信您的“ECMAScript 4,其中包括真正的int和uint操作”。此外,ECMAScript 4概述在声明中(第29页):“如果字节、int或uint上的操作溢出,那么结果将以“更好”的表示形式出现;…int和uint操作溢出到两倍”.ECMAScript 4的建议草案如下:在第29页,您可以看到int和uint的描述。有趣的是,int上的操作将溢出为double。您是对的,由于这个原因,AS编译器将使用
multiply
,这就是跟踪(0xFFFFFFFF*0xFFFFFF)的原因