Языки программирования, которые обрабатывают действительно огромные числа, используют пользовательские числовые примитивы, которые выходят за рамки обычных операций, оптимизированных для 32, 64 или 128-битных процессоров. Эти цифры особенно полезны в области компьютерной безопасности и математических исследований.
Библиотека Multiple Precision *1003*, вероятно, является наиболее полным примером этих подходов.
Вы можете обрабатывать большие числа, используя массивы. Попробуйте это в вашем веб-браузере. Введите следующий код в консоль JavaScript вашего веб-браузера:
Точка, в которой JavaScript не работает
console.log(9999999999999998 + 1)
// expected 9999999999999999
// actual 10000000000000000 oops!
JavaScript не обрабатывает простые целые числа выше 9999999999999998
. Но написать свой собственный числовой примитив - сделать этот расчет достаточно простым. Вот пример использования пользовательского класса сумматора чисел в JavaScript .
Сдача теста с использованием пользовательского номера класса
// Require a custom number primative class
const {Num} = require('./bases')
// Create a massive number that JavaScript will not add to (correctly)
const num = new Num(9999999999999998, 10)
// Add to the massive number
num.add(1)
// The result is correct (where plain JavaScript Math would fail)
console.log(num.val) // 9999999999999999
Как это работает
Вы можете посмотреть в коде class Num {...} , чтобы увидеть подробности происходящего; но вот основная схема используемой логики:
Классы:
- Класс
Num
содержит массив отдельных классов Digit
.
- Класс
Digit
содержит значение одной цифры и логику для обработки Carry flag
Шаги:
- Выбранный номер превращается в строку
- Каждая цифра превращается в класс
Digit
и сохраняется в классе Num
в виде массива цифр
- Когда
Num
увеличивается, он переносится на первый Digit
в массиве (крайнее правое число)
- Если значение
Digit
плюс Carry flag
равно Base
, то следующий Digit
влево вызывается для увеличения, и текущее число сбрасывается на 0
- ... Повторить до самой левой цифры массива
Логически это очень похоже на то, что происходит на уровне машины, но здесь оно не ограничено. Вы можете узнать больше о том, как цифры
несут здесь ; это может применяться к номерам любой базы.