Atomics.store/load方法(还有其他?看起来没有)不支持Float32Array。
我读到,这与以下事实是一致的:出于兼容性原因,它也不支持Float64Array(某些计算机不支持它)。
除了我认为这很愚蠢之外,这是否还意味着我必须将要使用的每个float都转换为unsigned 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]);
最佳答案
如您所见,Atomics方法将doesn't support floating point values作为参数:
Atomics.store(typedArray,索引,值)
typedArray
共享整数类型的数组。 Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array之一
或Uint32Array。
您可以像在发布的示例代码中所做的那样,从底层缓冲区中读取IEEE754表示形式为整数
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]);
或者,如果精度不重要,则可以使用固定数字。准确度当然取决于大小。
存储时按比例放大:
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
关于javascript - 在JavaScript中使用Atomics和Float32Array,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38022912/