2016-06-24 11 views
2

Die Atomics.store/load-Methoden (und andere? Nicht aussehen) unterstützen Float32Array nicht. Ich habe gelesen, dass dies im Einklang mit der Tatsache, dass es Float64Array aus Kompatibilitätsgründen nicht unterstützt (einige Computer unterstützen es nicht).Verwenden von Atomics und Float32Array in JavaScript

Abgesehen von der Tatsache, dass ich denke, dass das dumm ist, bedeutet das auch, dass ich jeden Float, den ich verwenden möchte, in einen unsigned int umwandeln muss?

Nicht nur wird dies in hässlichen Code resultieren, es wird es auch langsamer machen.

ZB:

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]); 

Antwort

2

Wie entdeckt man die Atomics Methoden doesn't support floating point values als Argument:

Atomics.store (TypedArray, Index-Wert)

TypedArray
        Eine gemeinsame Ganzzahl typisiertes Array. Eines von Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array,
        oder Uint32Array.

können Sie die IEEE754 Darstellung als ganze Zahl aus dem zugrunde liegenden Puffer gelesen, wie Sie im Beispiel-Code zu tun geschrieben Sie

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]);

oder Sie können feste Zahlen verwenden, wenn die Genauigkeit ist nicht wichtig. Die Genauigkeit wird natürlich durch die Größe bestimmt.

Scale-up bei der Lagerung:

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

zurückgelesen und verkleinere:

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