Как языки программирования обрабатывают огромное количество арифметики

Строка - это всего лишь последовательность символов, поэтому вы можете использовать код int 21 внутри цикла, чтобы получить строку, по одному символу за раз. Создайте метку в сегменте данных, чтобы удерживать строку, и каждый раз, когда вы читаете символ, скопируйте его на эту метку (каждый раз увеличивая смещение, чтобы ваши символы сохранялись последовательно). Стоп цикла, когда определенный символ читается (возможно, входит).

Выполнение всего этого вручную утомительно (подумайте о том, как будет работать backspace), но вы можете это сделать. Кроме того, вы можете связываться с stdio, stdlib и т. Д. И выполнять функции библиотеки вызовов, чтобы выполнять большую часть работы для вас.

11
задан danpen 15 May 2013 в 17:40
поделиться

8 ответов

Существует множество специализированных методов для выполнения вычислений с числами, превышающими размер регистра. Некоторые из них описаны в этой статье в Википедии о арифметике произвольной точности

Языки низкого уровня, такие как C и C ++, оставляют вычисления большого числа библиотеке по вашему выбору. Одна из примечательных - это библиотека GNU Multi-Precision . Языки высокого уровня, такие как Python и другие, интегрируют это в ядро ​​языка, поэтому обычные числа и очень большие числа идентичны программисту.

6
ответ дан 3 December 2019 в 10:04
поделиться

Вы ошиблись. Наибольшее число, которое он может обработать в одном регистре , является 64-битным числом. Однако с помощью некоторых умных методов программирования вы можете просто объединить несколько десятков этих 64-битных чисел в ряд, чтобы сгенерировать огромное 6400-битное число и использовать его для выполнения дополнительных вычислений. Это не так быстро, как уместить число в один регистр.

Даже старые 8- и 16-битные процессоры использовали этот трюк, когда они просто позволяли числу переполняться в другие регистры. Это усложняет математику, но не ограничивает возможности.

Однако такая высокоточная математика чрезвычайно необычна. Я думаю, даже если вы хотите рассчитать весь государственный долг США и сохранить результат в зимбабвийских долларах, 64-битное целое число все равно будет достаточно большим. Это'

1
ответ дан 3 December 2019 в 10:04
поделиться

Ада фактически поддерживает это изначально, но только для его бестиповых констант («именованных чисел»). Для фактических переменных вам нужно найти пакет произвольной длины. См. Целое число произвольной длины в Аде

1
ответ дан 3 December 2019 в 10:04
поделиться

В качестве мысленного эксперимента представьте числа, хранящиеся в виде строки. С функциями сложения, умножения и т. Д. Этих произвольно длинных чисел.

В действительности эти числа, вероятно, хранятся в более экономном месте.

0
ответ дан 3 December 2019 в 10:04
поделиться

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

Например (я просто придумываю это прямо сейчас), такая библиотека могла бы имитировать реальную методы, которые можно использовать для выполнения арифметических операций с большими числами вручную. Такие библиотеки обычно намного медленнее, чем использование встроенной арифметики, но иногда требуется дополнительная точность.

0
ответ дан 3 December 2019 в 10:04
поделиться

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

0
ответ дан 3 December 2019 в 10:04
поделиться

Большинство языков хранят их как массивы целых чисел. Если вы добавляете / вычитаете два из этих больших чисел, библиотека добавляет / вычитает все целые элементы в массиве отдельно и обрабатывает перенос / заимствование. Это похоже на ручное сложение / вычитание в школе, потому что так оно работает внутри.

В некоторых языках используются реальные текстовые строки вместо целочисленных массивов, что менее эффективно, но проще преобразовать в текстовое представление.

0
ответ дан 3 December 2019 в 10:04
поделиться

More-or-less the same way that you do. In school, you memorized single-digit addition, multiplication, subtraction, and division. Then, you learned how to do multiple-digit problems as a sequence of single-digit problems.

If you wanted to, you could multiply two twenty-digit numbers together using nothing more than knowledge of a simple algorithm, and the single-digit times tables.

1
ответ дан 3 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: