在Actionscript 3中整数乘法mod2³²

问题描述 投票:8回答:1

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

Actionscript声称基于ECMAScript,但ECMAScript根本不进行整数运算。它完成了IEEE-754双倍的所有操作,并在按位运算之前减少了模232的结果,在大多数情况下模拟整数运算。但是,这对于乘法不起作用:乘法的真实结果,例如,0x10000001 * 0x0FFFFFFF对于双尾数的尾数来说太长,因此如果遵循规范,则低位将丢失。

现在输入Actionscript。我已经通过实验发现,将两个intuint变量相乘并立即将产品投射到intuint似乎总能得出确切的结果。但是,生成的AVM2字节码只包含一个普通的“mul”指令,没有直接指示它应该产生整数结果而不是浮点结果;虚拟机必须向前看以找到它。我担心我在实验中幸运,并获得额外的精确度作为奖励,而不是我可以依赖的东西。

(首先,我的实验都是使用x86 Flash播放器进行的。也许它代表中间结果,因为Intel 80位加倍,或者在评估堆栈上存储64位int,直到它知道它将用于什么。在没有原生32×32→64乘法指令的非x86平板电脑上很容易实现,那么VM是否可以决定将精度降低到ECMAScript标准指定的范围?)

24小时状态:Mike Welsh做了一些有力的调查并提供了非常有用的链接,但遗憾的是还不足以解决这个问题。还有谁?

(tl;博士在评论中辩论:whitequark在某种程度上反驳了我的假设理由之一,为什么答案可能是“不”。他的观点有其优点,但当然不能表明答案是“是” )。

actionscript-3 actionscript language-lawyer
1个回答
4
投票

ActionScript 3基于ECMAScript 4,其中包括真正的32位int和uint操作。例如,multipy_i指令执行整数乘法(source:AVM2 Overview)。

不幸的是,Adobe AS编译器似乎只执行这些操作码的浮点版本,例如multiply,据称将操作数转换为64位浮点数。这可能与ECMAScript specs一致,var n:int = 0x7FFFFFFF; var n2:int = n*n; trace(n2); 声明在数学运算期间,为了处理溢出,整数将被提升为双精度数。如果它确实做了64位浮点乘法,然后转换回int,那么应该会有精度损失。

尽管如此,Flash Player在立即转换为int时似乎并没有失去精度。例如:

multiply

即使此代码发出Tamarin shell指令,它也会在Flash Player中找出1,如果没有精度损失,则会产生结果。目前尚不清楚这种行为是否一致且跨平台。但是,我在Flash Player上测试了几个平台,包括一些手机,结果似乎是1。但是,在解释模式下通过multiply_i运行此代码输出0! (JIT模式仍然输出1,所以这种行为必须是JIT的副作用)。因此依赖于此可能存在风险。

使用Haxe操作码应该表现得恰当。在使用int时,Apparat将使用此操作码。 qazxswpoi也可用于应用此操作码。

© www.soinside.com 2019 - 2024. All rights reserved.