Подтвердить что ты не робот

Набираемые массивы JavaScript: 64-разрядные целые числа?

Маскированные в JavaScript массивы, реализованные в Firefox 4 и Chrome 7, являются очень эффективным способом хранения и работы с двоичными данными в JavaScript. Однако текущие реализации предоставляют только целые представления до 32 бит на каждого члена, с Int32Array и Uint32Array. Планируются ли для реализации 64-битные целые представления? Как я могу реализовать 64-битные целые представления? Насколько они будут медленнее?

4b9b3361

Ответ 1

Нет практического способа реализации Int64Array, потому что все числа в JavaScript - это 64-битные числа с плавающей запятой, которые имеют только 53 бит точности. Как сказал Симеон в своем комментарии, вы могли бы использовать большую целочисленную библиотеку, но это было бы намного медленнее.

Если вам действительно нужен массив из 64-битных целых чисел, независимо от производительности, библиотека Google Closure имеет 64-разрядный Long класс, что я бы себе представлял быстрее, чем более общая большая целочисленная библиотека. Я никогда не использовал его, и я не знаю, можно ли легко отделить его от остальной библиотеки.

Ответ 2

Вы можете использовать Float64Array или Float32Array. Но я не знаю, если это то, что вы ищете, потому что это поплавок.

Ответ 3

Как уже говорилось, вы не можете безопасно выходить за пределы целого числа 2 ^ 52-1 с числами Javascript, потому что в числах Javascript действительно всегда 64-битные числа с плавающей запятой двойной точности, которые имеют только 53 значащих бита, а остальная часть относится к показателю степени, поэтому вы потеряете точная целочисленная точность после этого.

Но здесь, по крайней мере, как вы можете проверить, меньше ли целое беззнаковое 64-битное целое в Unit8Array меньше 2 ^ 52-1, а затем безопасно прочитать его, если хотите:

const dataView = new DataView(unit8Array.buffer);
const hi = dataView.getUint32(0);
if (hi > 0x1fffff) {
  throw new Error(
    'Cannot safely parse uints over 2^53 - 1 (0x1fffffffffffff) in to a 64 bit float.' +
    ' PropertyKey: ' + propertyKey,
  );
}
const lo = dataView.getUint32(4);
const numberValue = (hi * 0xffffffff) + lo;