Из этот вопрос, похоже, и Google Chrome, и Node.js решили реализовать арифметику произвольной точности в двоичном формате. Есть ли для этого веская причина?

Если мы можем сложить, вычесть, умножить или разделить и сделать 7 + 8 = 15 и перенести на следующую цифру, это будет быстрее, чем делать это побитно, при 7 + 8 нужно добавить два бита 4 раза.

1
nonopolarity 30 Дек 2019 в 02:35
3
«Двоичный» не означает «бит за битом». Это может быть выполнено 64 бита за раз на 64-битном процессоре или даже больше при использовании инструкций SIMD.
 – 
hyde
30 Дек 2019 в 02:41
Думаю, именно поэтому я провалил интервью, когда меня попросили добавить или «плюс 1» в интервью, и я сделал это с помощью десятичных цифр.
 – 
nonopolarity
30 Дек 2019 в 02:47
1
Обычно библиотеки BigNum оптимизируют скорость вычислений, а не вывода. Поскольку внутреннее число repr машины является двоичным, гораздо быстрее вычислять int32 / int64 как цифры в массиве. Вычисления с действительными десятичными цифрами в памяти будут намного медленнее (плюс более сложная обработка переноса цифр и т. Д., Причина, по которой компьютеры перешли на двоичную систему в первую очередь в 50-х годах). Обратной стороной является то, что на выходе действительно нужны десятичные цифры - теперь все число должно быть увеличено на 10, чтобы получить эти цифры.
 – 
jerch
30 Дек 2019 в 03:05

2 ответа

Разработчик V8 здесь. Двоичный - хороший выбор, потому что оборудование двоичное [*]. Это не означает, что операции выполняются по частям. В V8 «цифрами» BigInt являются значения uintptr_t, то есть целые числа без знака размером с регистр (32 бита на 32-битной машине, 64 бита на 64-битной машине). Обзор см. В нашем сообщении в блоге и источник всех кровавых подробностей. FWIW, многие другие реализации (например, GMP, OpenJDK, Go, Dart) сделали тот же базовый выбор.

[*] В некоторых аппаратных архитектурах есть инструкции для «двоично-десятичной» арифметики, которая похожа на то, что вы описываете, но этот подход (1) обычно считается менее эффективным и (2) доступен не на всех архитектурах, которые нам нужны. V8 для работы.

2
jmrk 30 Дек 2019 в 15:33

Один из возможных ответов: это делается путем сложения двух 32- или 64-битных целых чисел вместе, поэтому это быстрее, чем делать это по одной десятичной цифре за раз.

Чтобы получить результат умножения, возможно, за один цикл машинного кода, можно перемножить два 64-битных целых числа и получить все цифры результата.

0
nonopolarity 30 Дек 2019 в 02:39