Типизированные массивы JavaScript: 64-битные целые числа? - PullRequest
20 голосов
/ 18 мая 2011

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

Ответы [ 3 ]

16 голосов
/ 18 мая 2011

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

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

0 голосов
/ 28 июня 2019

Как уже говорилось, вы не можете безопасно выходить за пределы целого числа 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;
0 голосов
/ 13 февраля 2019

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

...