2016-06-24 1 views
2

Atomics.store/loadメソッド(および他のものは見えませんでした)は、Float32Arrayをサポートしていません。 これは、互換性の理由からFloat64Arrayもサポートしていないという事実と一致することを読んでいます(一部のコンピュータではサポートされていません)。JavaScriptでAtomicsとFloat32Arrayを使用する

私はこれが愚かだと言う事実とは別に、これは私が使用したいフロートをすべて符号なしのintにキャストしなければならないということを意味しますか?

これは醜いコードになるだけでなく、速度も遅くなります。

例:

let a = new Float32Array(1); // Want the result here 

Atomics.store(a, 0, 0.5); // Oops, can't use Float32Array 

let b = new Float32Array(1); // Want the result here 

let uint = new Uint32Array(1); 
let float = new Float32Array(uint.buffer); 

float[0] = 0.5; 

Atomics.store(b, 0, uint[0]); 

答えて

2

あなたが発見したよう、アトミックメソッドの引数としてdoesn't support floating point values

Atomics.store(typedArray、インデックス、値)

typedArray
        A共有整数型付き配列。 Int8Array、Uint8Array、Int16Array、Int32Array、Int32Array、
       またはUint32Arrayのうちの1つ。あなたがサンプルコードでは、あなたが

var buffer = new ArrayBuffer(4);   // common buffer 
 
var float32 = new Float32Array(buffer); // floating point 
 
var uint32 = new Uint32Array(buffer); // IEEE754 representation 
 

 
float32[0] = 0.5; 
 
console.log("0x" + uint32[0].toString(16)); 
 

 
uint32[0] = 0x3f000000; /// IEEE754 32-bit representation of 0.5 
 
console.log(float32[0]);

たり、場合固定番号を使用することができます投稿くださいとしてあなたが基本となるバッファの整数としてIEEE754表現を読むことができ

精度は重要ではない。精度はもちろん、大きさによって決定される。

Atomics.store(a, 0, Math.round(0.5 * 100)); // 0.5 -> 50 (max two decimals with 100) 

をリードバックし、スケールダウン:

value = Atomics.load(a, 0) * 0.01;   // 50 -> 0.5 
保存

スケールアップ

関連する問題