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