Хранение 64-битных временных меток в Javascript 53-битном числовом формате - PullRequest
0 голосов
/ 27 апреля 2018

Фон

Я декодирую данные из буфера, метка времени которого закодирована в 8 байтов (64 бита).

Обычно это не было бы проблемой, за исключением того, что Number в JavaScript работает только с числами до 53 бит - тогда он теряет точность.

Проблема

Это означает, что если я сохраню эту метку времени в номере JavaScript, я потеряю точность, поскольку формат числа не достаточно большой, чтобы хранить метку времени.

Поскольку это приложение, требующее точности по времени по крайней мере с точностью до секунды, я не стремлюсь потерять слишком большую точность.

Пример

Чтобы доказать мою точку зрения, вот шестнадцатеричная строка с меткой времени длиной 64 бита. Если вы используете Node.js, вы можете проверить его следующим образом:

//a small timestamp from our current time in history
var buf = Buffer.from(
    "162F1544EA81242A",
    "hex"
);

buf.readUInt( 0, 6 ); // lost 2 bytes of precision here!

Эта временная метка должна дать некоторое значение в будущем:

Предполагая, что эта метка времени находится в микросекундах (1/1 000 000 секунд): GMT: четверг, 27 августа 2020 г. 9: 16: 18.476 AM Ваш часовой пояс: Четверг, 27 августа 2020 года 11: 16: 18.476 по Гринвичу + 02: 00 по летнему времени

Вопрос

  • Какую точность (в миллисекундах) потеряет временная метка 64 бита, если она будет сохранена в 53-битном числовом формате JavaScript?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

JavaScript Number.MAX_SAFE_INTEGER, 2 ^ 53 - 1, имеет значение 9 007 199 254 740 991. Однако следует понимать, что в дополнение к 53 битам целочисленной точности есть знаковый бит, поэтому, если ваши временные метки подписаны, вы также можете воспользоваться этим.

Давайте придерживаться идеи, что это временная метка в микросекундах, а не в миллисекундах. Какой интервал времени охватывает 53 бита плюс знаковый бит? Преобразование 9 007 199 254 740 991 микросекунд в годы, и вы получите примерно ± 285 лет. Для большинства целей этого должно быть достаточно.

Если вы выберете снижение разрешения и преобразование в миллисекунды, тогда ваши временные метки могут охватывать диапазон ± 285 000 лет.

0 голосов
/ 27 апреля 2018

Это легко проверить, JavaScript использует ровно 64-битные числа с плавающей запятой для хранения чисел, с плавающей запятой означает, что точность уменьшается с ростом числа, поэтому выберите максимально возможное значение, которое вам нужно, и попробуйте вычесть 1, 2, 3 и т. Д. пока вы не получите другое значение, таким образом, у вас будет минимальная разница во времени, которую можно зарегистрировать.

...