Hen*_*olm 8 actionscript actionscript-3 language-lawyer
有没有人遇到过关于int和uint算术如何在Actionscript 3中运行的权威规范?("权威"是指"来自Adobe"或"已被Adobe宣布为权威").特别是我正在寻找一种支持的方法来做整数乘法模2 32.我无法找到的任何Adobe文档都没有涵盖这一点.
Actionscript声称基于ECMAScript,但ECMAScript根本不进行整数运算.它在IEEE-754双打上完成所有操作,并在按位运算之前减少模数2 32,在大多数情况下模拟整数运算.但是,这对于乘法不起作用:乘法的真实结果,例如,0x10000001*0x0FFFFFFF对于双尾数的尾数来说太长,因此如果遵循规范,则低位将丢失.
现在输入Actionscript.我已经通过实验发现,将两个int或多个uint变量相乘并立即将产品投入int或uint总是给我确切的结果.但是,生成的AVM2字节码只包含一个普通的"mul"指令,没有直接指示它应该产生整数结果而不是浮点结果; 虚拟机必须向前看以找到它.我担心我在实验中幸运,并获得额外的精确度作为奖励,而不是我可以依赖的东西.
(首先,我的实验都是使用x86 Flash播放器进行的.也许它代表中间结果,因为Intel 80位加倍,或者在评估堆栈上存储64位int,直到知道它将用于什么.在没有原生32×32→64乘法指令的非x86平板电脑上很容易实现,那么VM是否可以决定将精度降低到ECMAScript标准指定的范围?)
24小时状态:迈克威尔士做了一些有能力的调查并提供了非常有用的链接,但遗憾的是还不足以解决这个问题.还有谁?
(tl;博士在评论中辩论:whitequark在某种程度上反驳了我的假设理由之一,为什么答案可能是"不".他的观点有其优点,但当然不能表明答案是"是" ).
ActionScript 3 基于 ECMAScript 4,其中包括真正的 32 位 int 和 uint 运算。例如,该multipy_i指令执行整数乘法(来源:AVM2 概述)。
不幸的是,Adobe AS 编译器似乎只执行这些操作码的浮点版本,例如multiply,据称它将操作数转换为 64 位浮点。这可能符合ECMAScript 规范,该规范规定,在数学运算期间,整数将被提升为双精度,以便处理溢出。如果它确实执行 64 位浮点乘法,然后转换回 int,那么应该会损失精度。
尽管如此,Flash Player 在立即转换回 int 时似乎并没有失去精度。例如:
var n:int = 0x7FFFFFFF;
var n2:int = n*n;
trace(n2);
Run Code Online (Sandbox Code Playgroud)
即使此代码发出一条multiply指令,它也会在 Flash Player 中追踪出 1,这是在没有精度损失的情况下的结果。目前尚不清楚这种行为是否一致且跨平台。不过,我在多个平台(包括几部手机)的 Flash Player 中进行了测试,结果似乎始终为 1。然而,在解释模式下通过Tamarin shell运行此代码会输出 0!(JIT 模式仍然输出 1,因此此行为一定是 JIT 的副作用)。所以依赖这个可能有风险。
相反,使用multiply_i操作码应该表现得适当。Haxe在处理整数时将使用此操作码。装置也可用于应用该操作码。
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |