将两个 Uint32Array 值转换为 Javascript 数字

Tim*_*nen 5 javascript types numbers

我从这里找到了一个代码,它将 Javascript 数字转换为内部 IEEE 表示,作为两个 Uint32 值:

function DoubleToIEEE(f)
{
  var buf = new ArrayBuffer(8);
  (new Float64Array(buf))[0] = f;
  return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ];
}
Run Code Online (Sandbox Code Playgroud)

如何将返回值转换回 Javascript 数字?这边走:

var number = -10.3245535;
var ieee = DoubleToIEEE(number)
var number_again = IEEEtoDouble(ieee);
// number and number_again should be the same (if ever possible)
Run Code Online (Sandbox Code Playgroud)

Tim*_*nen 5

我找到了一个可能的解决方案,它似乎有效:

function IEEEToDouble(f)
{
  var buffer = new ArrayBuffer(8);
  (new Uint32Array(buffer))[0] = f[0];
  (new Uint32Array(buffer))[1] = f[1];
  return new Float64Array(buffer)[0];
}
Run Code Online (Sandbox Code Playgroud)

用法:

var a = DoubleToIEEE(-0.1234);
console.log(a); // [0, 3220176896]
var b = IEEEToDouble(a);
console.log(b); // -0.1234
Run Code Online (Sandbox Code Playgroud)


Ber*_*rgi 5

这段代码太丑了。用

function DoubleToIEEE(f) {
  var buf = new ArrayBuffer(8);
  var float = new Float64Array(buf);
  var uint = new Uint32Array(buf);
  float[0] = f;
  return uint;
}
Run Code Online (Sandbox Code Playgroud)

如果您想要一个实际的Array而不是一个Uint32Array(在大多数情况下应该没有区别),请添加一个Array.from电话。您还可以通过将值传递给Float64Array构造函数来将其减少为单行:

function DoubleToIEEE(f) {
  // use either
  return new Uint32Array(Float64Array.of(f).buffer);
  return Array.from(new Uint32Array(Float64Array.of(f).buffer));
  return Array.from(new Uint32Array((new Float64Array([f])).buffer));
}
Run Code Online (Sandbox Code Playgroud)

uint反过来只是将输入写入插槽并返回float[0]值:

function IEEEToDouble(is) {
  var buf = new ArrayBuffer(8);
  var float = new Float64Array(buf);
  var uint = new Uint32Array(buf);
  uint[0] = is[0];
  uint[1] = is[1];
  return float[0];
}
Run Code Online (Sandbox Code Playgroud)

可以缩短为

function IEEEToDouble(is) {
  return (new Float64Array(Uint32Array.from(is).buffer))[0];
}
Run Code Online (Sandbox Code Playgroud)