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/

10-09 10:13