2016-03-08 10 views
4

Мы (люди) занимаем больше времени, чтобы умножать, добавлять, делить и вычитать два больших числа, чем два небольших числа.делает компьютер больше времени для умножения, деления, вычитания, добавления двух больших чисел, чем меньшее число.

Есть ли у компьютера больше времени для умножения 5 * 2, чем сказать 51234 * 987654 или операция выполняется за такое же количество времени?

Как насчет двух чисел, которые больше, чем размер слова процессора (например, два 128-битного номера)?

Я видел статью https://en.wikipedia.org/wiki/Multiplication_algorithm

+3

Почему бы не раз это? –

+1

Зависит от того, на каком компьютере, какая операция, насколько велика, может быть, фаза луны. – harold

+0

Я думаю, что они имеют одинаковую сложность, поскольку, как бы CPU знал, является ли это число большим или маленьким? Ему все равно придется пережевывать каждый бит (независимо от того, являются ли старшие бит 0). –

ответ

6

зависит от входного типа. Для примитивов, которые изначально поддерживаются процессором, например, умножение 64-битных чисел на 64-битный процессор: нет, это атомные операции, которые всегда занимают ровно столько же времени. Для не-примитивных типов данных, таких как Java BigInteger или сопоставимых классов библиотек на других языках: да, они больше не являются атомарными операциями и, следовательно, отличаются количеством времени, требуемого в зависимости от размера операндов.

Умножение примитивов всегда занимает одинаковое количество времени из-за простой причине: операция строить зашитым без условного исполнения и всегда будет перебирать все 64bits на 64-битном процессоре, независимо от того, является ли вход всего 5 бит или занимает все 64 бит. То же самое применимо к архитектурам для любого другого количества бит.

EDIT:
Как указано в @nwellnhof: некоторые инструкции фактически содержат ветвление, например, арифметику с плавающей запятой. Обычно эти инструкции основаны на микрокоде и поэтому не могут считаться атомарными инструкциями в более узком смысле.

+0

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

+0

@nwellnhof, думаю, я должен сказать немного точнее. Для упрощения я написал инструкции для микрокода. – Paul

8

Предполагая, что вас интересует в основном семейство x86, было время, когда умножение времени было зависеть от операндов. Это было в предыдущем столетии - процессоры до 80486 включительно. Из Pentium on, imul всегда выполнял ряд циклов, независимо от его ввода.

Подразделение всегда было и остается операцией, которая принимает несколько циклов, которые делает зависит от входов как-то, IIRC зависит в основном от величины результата.

Инструкции по плавающей запятой часто могут принимать переменное время, если вы считаете также «странный вход», например, денормалы.