Подтвердить что ты не робот

Как компьютер умножает 2 числа?

Как компьютер выполняет умножение на 2 числа, скажем, 100 * 55.

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

Примечание. Это было задано в интервью.

4b9b3361

Ответ 1

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

1100100
0110111
=======
0000000
-1100100
--1100100
---0000000
----1100100
-----1100100
------1100100
==============
1010101111100

Для чисел с плавающей запятой используется научная нотация.

100 is 1 * 10^2 (10 to the power of 2 = 100)
55 is 5.5 * 10^1 (10 to the power of 1 = 10)

Чтобы умножить их вместе, умножьте мантиссы и добавьте показатели

= 1 * 5.5 * 10^(2+1)
= 5.5 * 1000
= 5500

Компьютер выполняет это с использованием двоичных эквивалентов

100 = 1.1001 * 2^6
55  = 1.10111* 2^5
-> 1.1001 * 1.10111 * 2^(6+5)

Ответ 2

Обычно используемый метод называется частичными продуктами, такими как люди, поэтому, например, имея 100*55, он сделает что-то вроде

  100 X
   55
 ----
  500 +
 500
 ----

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

В настоящее время большинство оптимизаций могут суммировать все частичные данные всего за 1 цикл, что позволяет быстрее вычислять и упрощать распараллеливание.

Посмотрите здесь: http://en.wikipedia.org/wiki/Binary_multiplier

В конце вы можете найти некоторые реализации, такие как

Ответ 3

Один из способов - использовать длинное умножение в двоичном формате:

       01100100 <- 100
     * 00110111 <- 55
     ----------
       01100100
      01100100
     01100100
   01100100
  01100100
---------------
  1010101111100 <- 5500

Это иногда называют сдвигом и добавлением.

Ответ 4

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

Ответ 5

Хорошо, вот иди. Я написал это некоторое время назад (1987!), Поэтому некоторые вещи изменились, в то время как другие остались теми же...

http://moneybender.com/transactor_article.pdf

Ответ 7

Ответ: это зависит. Как указывали другие, вы можете использовать тот же алгоритм, что и в школе, но вместо этого использовали двоичный код. Но для небольших чисел есть и другие способы.
Скажем, что вы хотите размножить два 8-битных номера, это можно сделать с помощью большой таблицы поиска. Вы просто объединяете два 8-битных числа, чтобы сформировать 16-битное число, и используйте этот nunber для индексации в таблицу со всеми продуктами.
Или вы можете просто иметь большую сеть ворот, которая напрямую вычисляет функцию. Эти сети ворот, как правило, становятся довольно громоздкими для умножения больших чисел.

Ответ 8

Чтобы умножить два числа с плавающей запятой, используется следующая процедура:

  • Умножьте мантиссы
  • Добавьте экспоненты
  • Нормализовать результат (десятичная точка появляется после первой ненулевой цифры)

Итак, в базе 10 для умножения 5.1E3 и 2.6E-2

Умножьте мантиссы = > 5.1 * 2.6 = 13.26 (это можно сделать с помощью целочисленного умножения, если вы отслеживаете, где должна быть десятичная точка)

Добавьте экспоненты = > 3 + -2 = 1

Дает нам результат 13.26E1

Нормализовать 13.26E1 = > 1.326E2

Ответ 9

Я просто кодирую простую программу, умножая два числа, хранящихся в 2 строках в файле, используя алгоритм длительного умножения. Он может умножать два числа, которые имеют более 1 миллиарда чисел друг в друге

Пример:

            23958233
            5830 ×
         ------------
            00000000  ( =      23,958,233 ×     0)
           71874699   ( =      23,958,233 ×    30)
          191665864   ( =      23,958,233 ×   800)
         119791165    ( =      23,958,233 × 5,000)

Исходный код:

Пожалуйста, просмотрите и дайте свой комментарий http://code.google.com/p/juniormultiply/source/browse/#svn/trunk/src