在 JavaScript 中使用 Atomics 和 Float32Array
Using Atomics and Float32Array in JavaScript
Atomics.store/load 方法(和其他方法?没看)不支持 Float32Array。
我读到这是为了与它出于兼容性原因也不支持 Float64Array 的事实保持一致(某些计算机不支持它)。
除了我认为这很愚蠢之外,这是否还意味着我必须将我想使用的每个浮点数转换为无符号整数?
这不仅会导致代码难看,还会使其变慢。
例如:
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, index, value)
typedArray
A shared integer typed array. One of Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array,
or 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
另一个答案对我帮助不大,我花了一段时间才找到解决方案,但这是我解决同样问题的方法:
var data = new SharedArrayBuffer(LEN * 8);
var data_float = new Float32Array(data);
var data_int = new Uint32Array(data);
data_float[0] = 2.3; //some pre-existing data
var tmp = new ArrayBuffer(8);
var tmp_float = new Float32Array(tmp);
var tmp_int = new Uint32Array(tmp);
tmp_int[0] = Atomics.load(data_int, 0);
tmp_float[0] += 1.1; //some math
Atomics.store(data_int, 0, tmp_int[0]);
console.log(data_float[0]);
Atomics.store/load 方法(和其他方法?没看)不支持 Float32Array。 我读到这是为了与它出于兼容性原因也不支持 Float64Array 的事实保持一致(某些计算机不支持它)。
除了我认为这很愚蠢之外,这是否还意味着我必须将我想使用的每个浮点数转换为无符号整数?
这不仅会导致代码难看,还会使其变慢。
例如:
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, index, value)
typedArray
A shared integer typed array. One of Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array,
or 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
另一个答案对我帮助不大,我花了一段时间才找到解决方案,但这是我解决同样问题的方法:
var data = new SharedArrayBuffer(LEN * 8);
var data_float = new Float32Array(data);
var data_int = new Uint32Array(data);
data_float[0] = 2.3; //some pre-existing data
var tmp = new ArrayBuffer(8);
var tmp_float = new Float32Array(tmp);
var tmp_int = new Uint32Array(tmp);
tmp_int[0] = Atomics.load(data_int, 0);
tmp_float[0] += 1.1; //some math
Atomics.store(data_int, 0, tmp_int[0]);
console.log(data_float[0]);