2016-05-28 9 views
1

明らかに、JavaScriptの数字は明示的に型付けされていませんが、インタプリタによって型として表現されます。私はちょうどそれが32ビットの数に大きく最適化されていると言ったGoogleのV8 JSエンジンに関することを見たが、それは浮動小数点でも倍精度浮動小数点数の必要性を持っている奇妙な多くのJSプログラマーを見つけた。私が個人的に考えることのできる唯一の例は、0と1の間のスクリーン座標を正規化するために頻繁に行う2つの整数を分割する場合です。インタープリタは結果を32ではなく64ビットで切り捨てます。私には、しかし、再び私は他の誰かがそのような精度を必要とするそれを指定する方法を知らない。だから今私は疑問に思っています... 2つの(巨大ではない)整数の商が32ビット長以下であることを保証する方法はありますか?JavaScriptでは、浮動小数点数が32ビット以下になるようにするにはどうすればよいですか?

+1

すべてのJavaScriptの数値は、倍精度浮動小数点値です。いくつかの計算*は内部的に整数計算で実行されるかもしれませんが、(型付き配列に格納された値以外の)数値は倍精度であり、型付き配列であっても値が式に抽出されるとすぐに倍になります。 – Pointy

+0

V8について見たリファレンス(または「もの」)へのリンクを投稿できると便利です。 – Pointy

+0

現代のランタイムは、特定の式に整数だけが含まれるかどうかを判断するために、いくつかの静的コード分析を実行する(または少なくとも* can *)と言ってもいいと思います。通常は、変数が参照されるときに 'n | 0'のように役立つ記号のセットがあります。それはあなたの情報源が話していたものかもしれません。通常は、かなり稀なパフォーマンスクリティカルなコードに対しては、メンテナンスするのが難しいために行われます。 – Pointy

答えて

1

私はちょうど大幅にのみ、それは彼らがすることを推測することができたときにV8が内部で整数としてこれらの数字を格納しないことを意味32ビット数

用に最適化されていますと、GoogleのV8 JSエンジンについての事を見ましたそれぞれの範囲にとどまる。これは、カウンタや配列インデックスなどでよく使用されます。

2つの(巨大ではない)整数の商が32ビット未満であることを保証する方法はありますか?

すべての算術演算は、64ビットの浮動小数点数(JS内のすべての数値など)と同じように実行されます。あなたができることは、結果を32ビット整数に切り捨てることだけです。あなたは、内部で整数にそのオペランドをキャストされ、そのためにbitwise right shift operatorを使用します:

var q = (a/b) >>> 0; 

詳細についてはWhat is the JavaScript >>> operator and how do you use it?を参照してください。

+0

私はそれを32に切り捨てるかどうかに関わらず、コンパイラはそれを二重として扱いますと思っていますか? –

+0

@Sophia:それはコンパイラがどれほど巧妙であるかによって異なります。言語仕様の点では、yes - double型に分割され、次に整数にキャストされ、その後に戻されます。それは、おそらく最も速い通訳がやっていることでしょう。最適化コンパイラ、またはasm.jsコンパイラ[might](http://stackoverflow.com/q/31767070/1048572)は、整数ですべてを行うことを決定します(全体の動作が同じである限り)。 – Bergi

+0

私はv8コマンドラインでそれをテストすることができますが、私の理解ではインラインキャッシングを使用しています。まずコードを実行してから*戻って、可能な限り最適化します。これは、コンパイラがいくつかのコードでしか動作しない、つまり壊れる可能性のあるエッジケースがあると言う理由です。したがって、商を32に切り捨てるとより速くなると仮定します。 –

関連する問題