8

Actionscript 3 で int と uint の演算がどのように機能するかについて、正式な仕様に出くわした人はいますか? (「信頼できる」とは、「Adobe から提供された」または「Adobe によって信頼できると宣言されている」ことを意味します)。特に、2 32を法とする整数乗算を行うサポートされている方法を探しています。これは、私が見つけた Adob​​e ドキュメントではカバーされていません。

Actionscript は ECMAScript に基づいていると主張していますが、ECMAScript は整数演算をまったく行いません。IEEE-754 double ですべてを実行し、ビット単位の演算の前に結果を法 2 32に減らします。これにより、ほとんどの場合、整数演算がシミュレートされます。ただし、これは乗算には機能しません。乗算の真の結果、たとえば 0x10000001 * 0x0FFFFFFF は double の仮数には長すぎるため、指定が文字どおりに行われると下位ビットが失われます。

ここで、Actionscript を入力します。2 つのor変数を乗算し、積をorにすぐにキャストすると、常に正確な結果が得られるように思われることが実験的にわかりました。ただし、生成された AVM2 バイトコードには、単純な「mul」命令が含まれているだけで、浮動小数点ではなく整数の結果を生成することになっていることを直接示すものはありません。仮想マシンは、これを見つけるために先を見なければなりません。実験で運が良かっただけで、信頼できるものではなくボーナスとして余分な精度を得たのではないかと心配しています.intuintintuint

(1 つには、私の実験はすべて x86 Flash プレーヤーを使用して実行されました。おそらく、それは中間結果を Intel 80 ビット double として表すか、またはそれが何に使用されるかがわかるまで評価スタックに 64 ビット int を格納します。どちらもネイティブの 32×32→64 乗算命令がない非 x86 タブレットで簡単に可能になるため、VM は ECMAScript 標準で指定されている精度まで下げることを決定する可能性がありますか?)

24 時間の状況: Mike Welsh は適切な調査を行い、非常に役立つリンクを提供しましたが、残念ながら質問を閉じるには不十分です。他の誰か?

(tl;dr コメントでの討論: whitequark は、答えが「いいえ」である可能性がある私の仮説的な理由の 1 つにある程度反論します。彼の指摘にはメリットがありますが、もちろん答えが「はい」であることを示すものではありません。 )。

4

1 に答える 1

4

ActionScript 3 は、真の 32 ビット int および uint 操作を含む ECMAScript 4 に基づいていました。たとえば、このmultipy_i命令は整数乗算を実行します (出典: AVM2 の概要)。

残念ながら、Adobe AS コンパイラは、これらのオペコードの float バージョンのみを実行するようです。たとえばmultiply、オペランドを 64 ビット float としてキャストすると思われます。これはおそらく、オーバーフローを処理するために数学演算中に int が double に昇格されると述べているECMAScript 仕様に準拠しています。実際に 64 ビットの float 乗算を実行してから int に戻すと、精度が失われるはずです。

それにもかかわらず、Flash Player はすぐに int にキャストし直しても精度が失われないようです。例えば:

var n:int = 0x7FFFFFFF;
var n2:int = n*n;
trace(n2);

このコードはmultiply命令を発行しますが、Flash Player で 1 をトレースします。これは、精度の損失がない場合の結果です。この動作が一貫してクロスプラットフォームであるかどうかは不明です。ただし、いくつかの携帯電話を含むいくつかのプラットフォームの Flash Player でテストしたところ、結果は一貫して 1 のようでした。ただし、解釈モードでTamarin シェルを介してこのコードを実行すると、0! が出力されました。(JIT モードは依然として 1 を出力したため、この動作は JIT の副作用であるに違いありません)。したがって、これに依存するのは危険かもしれません。

multiply_i代わりにオペコードを使用すると、適切に動作するはずです。Haxeは int を操作するときにこのオペコードを使用します。Apparatを使用して、このオペコードを適用することもできます。

于 2011-08-07T17:22:48.677 に答える