Як основна математика ефективно оцінюється мовами програмування?


22

Коли я все більше і більше займаюся теорією програмування, я відчуваю себе зачарованим і ошелешеним, здавалося б, простими речами.

З : Як це працює?

A : Тому що це робить!

Я ненавиджу це усвідомлення! Я люблю знання, а крім того, я люблю навчання, що призводить мене до мого питання (хоч це і широке).

Питання:

Як оцінюються основні математичні оператори за допомогою мов програмування?

Як удосконалилися сучасні методи?

Приклад

var = 5 * 5; 

Моє тлумачення:

$num1 = 5; $num2 = 5; $num3 = 0;
while ($num2 > 0) {
    $num3 = $num3 + $num1;
    $num2 = $num2 - 1;
}
echo $num3;

Це здається дуже неефективним. У випадку вищих факторів цей метод дуже повільний, тоді як стандарт, вбудований у метод, є миттєвим. Як би ви імітували множення без ітераційного додавання?

var = 5 / 5;

Як це навіть робиться? Я не можу придумати спосіб буквально розділити його на 5 рівних частин.

var = 5 ^ 5; 

Ітерації ітерацій додавання? Моє тлумачення:

$base = 5;
$mod = 5;
$num1 = $base;
while ($mod > 1) {

    $num2 = 5; $num3 = 0;
    while ($num2 > 0) {
        $num3 = $num3 + $num1;
        $num2 = $num2 - 1;
    }
    $num1 = $num3;
    $mod -=1;
}
echo $num3;

Знову ж таки, це НАДАГО неефективно, але я не можу придумати іншого способу зробити це. Це ж питання поширюється на всі пов'язані з математикою функції, які обробляються автоматично.


1
Трохи передмістя про мене, я пряму до коледжу з інформатики, а згодом у математичній теорії життя, а також, можливо, філософії та теоретичної фізики. Багато прагнень, мало часу.
Корвін Сзанто

10
Чи можна припустити, що ви переглянули всі посилання із en.wikipedia.org/wiki/Category:Computer_arithmetic ?
JB King

2
Принципово це схоже на те, як у початковій школі вас вчили робити багатоцифрове множення та довгий поділ. Візьміть одну цифру A, помножте на B. Shift на десять. Візьміть наступну цифру A, помножте на B. Повторіть для всіх цифр і додайте їх разом. Оскільки це двійкове, однозначне множення простіше (це або x0, або x1), і замість зсуву на десять, ви подвоюєтесь. Поділ схожий.
Запитуйте про Моніку

Відповіді:


35

Щоб дійсно зрозуміти, як працює арифметика всередині комп'ютера, потрібно запрограмувати мовою складання. Переважно один із невеликим розміром слова та без інструкцій на множення та ділення. Щось на зразок 6502.

На 6502 практично вся арифметика робиться в регістрі під назвою Акумулятор. (Реєстр - це спеціальне місце пам'яті всередині процесора, до якого можна отримати швидкий доступ.) Отже, щоб додати два числа, ви завантажуєте перше число в Акумулятор, а потім додаєте до нього друге число.

Але це надто спрощує. Оскільки 6502 - це 8-розрядний процесор, він може обробляти числа лише від 0 до 255. Більшу частину часу ви захочете мати можливість працювати з більшими числами. Ви повинні додати ці шматки, 8 біт за один раз. Процесор має прапор Carry, який встановлюється, коли результат додавання двох чисел переповнює Акумулятор. Процесор додає, що, роблячи додавання, тому його можна використовувати для "перенесення 1", якщо ви починаєте з найменшого байту числа. Багатобайтне додавання на 6502 виглядає так:

  1. Очистити прапор (CLC)
  2. Завантажте найменший байт першого номера (LDA, акумулятор навантаження)
  3. Додавання байту другого порядку другого номера (АЦП, додавання з перенесенням)
  4. Зберігати байт результату найнижчого порядку (STA, накопичувач акумулятора)
  5. Повторіть кроки 2-4 з послідовно байтами вищого порядку
  6. Якщо в кінці встановлено перенос, ви переповнилися; вжити відповідних дій, таких як генерування повідомлення про помилку (BCS / BCC, гілка, якщо нести встановлено / очистити)

Віднімання подібне, за винятком того, що ви встановите перенос спочатку, використовуйте інструкцію SBC замість ADC, і в кінці переносу буде зрозуміло, чи був підвод.

Але зачекайте! А як щодо негативних чисел? Що ж, з 6502 вони зберігаються у форматі, який називається доповненням двох. Якщо припустити 8-бітове число, -1 зберігається як 255, тому що, коли ви додасте 255 до чогось, ви отримуєте на менше менше в Акумуляторі (плюс перенесення). -2 зберігається як 254 і так далі, аж до -128, що зберігається як 128. Отже, для підписаних цілих чисел половина діапазону 0-255 байтів використовується для додатних чисел, а половина - для від'ємних чисел. (Ця конвенція дозволяє вам просто перевірити високий біт числа, щоб побачити, чи він негативний.)

Подумайте про це як про цілодобовий годинник: додавання 23 до часу призведе до часу на годину раніше (наступного дня). Отже 23 - модульний еквівалент годинника -1.

Якщо ви використовуєте більше 1 байта, ви повинні використовувати більші числа для негативів. Наприклад, 16-бітні цілі числа мають діапазон 0-65536. Отже, 65535 використовується для представлення -1 і так далі, тому що додавання 65535 до будь-якого числа призводить до меншого (плюс перенесення).

На 6502 є лише чотири арифметичні операції: додавання, віднімання, помноження на два (зсув вліво) і ділення на два (зсув праворуч). Множення та ділення можна здійснити, використовуючи лише ці операції при роботі в двійковій формі. Наприклад, розглянемо множення 5 (двійковий 101) і 3 (двійковий 11). Як і з десятковим довгим множенням, ми починаємо з правильної цифри множника і множимо 101 на 1, даючи 101. Потім перекладаємо множник вліво і множимо 1010 на 1, даючи 1010. Потім ці результати додаємо разом, даючи 1111, або 15. Оскільки ми колись тільки множимось на 1 або 0, ми насправді не множимо; кожен біт множника просто служить прапором, який повідомляє нам, чи слід додавати (зміщений) мультиплікацію чи ні.

Ділення аналогічно ручному довгому поділу, використовуючи пробні дільники, крім двійкових. Якщо ви ділите на константу, це можливо зробити аналогічно відніманню: замість того, щоб ділити на X, ви помножуєтесь на попередньо розраховане передання 1 / X, яке дає бажаний результат плюс перелив. Навіть сьогодні це швидше, ніж поділ.

Тепер спробуйте зробити математику з плаваючою комою в збірці або перетворити числа з плаваючою комою в хороші вихідні формати в зборі. І пам’ятайте, це 1979 рік, а тактова частота - 1 МГц, тому ви повинні робити це максимально ефективно.

Речі все ще працюють приблизно так, як сьогодні, за винятком більших розмірів слів і більшої кількості регістрів, і, звичайно, більшість математики зараз виконується апаратними засобами. Але це все одно робиться таким же фундаментальним способом. Наприклад, якщо ви додаєте кількість змін і додаєте, необхідні для множення, наприклад, це досить добре співвідноситься з кількістю циклів, необхідних для інструкції з апаратного множення на ранніх процесорах, що мають таку інструкцію, як 6809, де вона виконувалася в мікрокоді так само, як ви це зробили б вручну. (Якщо у вас більший бюджет транзистора, існують більш швидкі способи зміни і доповнення, тому сучасні процесори не виконують цих операцій послідовно і можуть виконувати множення всього за один цикл.)


3
Гей, дякую за дуже детальне пояснення! Це саме те, що я хотів! Будучи на моєму рівні, ти часто забуваєш, що те, що тебе підтримує, як правило, складніше, ніж все, що ти робиш. Саме тому я хочу вивчати інформатику. Я ненавиджу той факт, що якби я повернувся у часі, я б не знав, що нічого не зміниться, як правильно сформулювати належну SQL-заяву;) У будь-якому випадку, дякую вам, що витратили час, щоб написати цю відповідь, ти дав мені тестувальник смаку того, в чому я збираюся заглибитися.
Корвін Сзанто

7
не погоджуйтесь, збірка все ще занадто висока, якщо ви хочете знати, як комп’ютери виконують арифметику, ви повинні дивитись на апаратні засоби або хоча б апаратні алгоритми
jk.

Е-е. Як тільки ви дізнаєтесь, що є добавки та перемикачі, їх так само просто уявити, як вони керуються апаратним забезпеченням, як і програмним забезпеченням, і з програмою простіше грати.
kindall

4
-1. Помноження обладнання не було зроблено зі змінами та додає вже близько 3 десятиліть, і багато процесорів можуть робити множення за один цикл. Перегляньте статтю у Вікіпедії на Binary Multiplierдеталі.
Мейсон Уілер

24

Зрештою, основні арифметичні операції виконуються апаратно. Більш конкретно, в ЦП (або власне його підрозділ)

Іншими словами, це електронні схеми. Встановіть відповідні біти як вхідні дані, і ви отримаєте відповідні біти як вихід. Це поєднання основних логічних воріт.

http://en.wikipedia.org/wiki/Adder_%28electronics%29

http://en.wikipedia.org/wiki/Binary_multiplier


3
Алгоритми апаратного забезпечення ретельно уточнюються і можуть вивчатися окремо від апаратних засобів.
S.Lott

@ S.Lott: Я вважаю ваш коментар заплутаним. Для мене алгоритми включають ряд кроків, які ви виконуєте, процедуру, те, що ви можете запрограмувати. Тут мова йде про електронні схеми, що виконують основні арифметичні операції. Іншими словами, просто послідовність воріт, куди тече струм. Тож це в кращому випадку "логічно", ніж "алгоритмічно". ... мої 2 копійки.
dagnelies

6
Алгоритм є "кінцевим, визначеним та ефективним". Це може бути в схемах, або з папером і олівцем, або з тинкертоями або молекулами в посуді або ДНК. Алгоритмом може бути що завгодно. Електронна схема повинна слідувати визначеному алгоритму. Це магічним чином не минає потреби в алгоритмах.
S.Lott

1
Чи вважається процес, що складається лише з одного кроку, «алгоритмом»? FWIW, електронні схеми, як правило, дотримуються таблиці правдивості - обробка в один крок. Те, що таблиця істини в кінцевому підсумку "збирається" у багатошарові ворота, не перешкоджає тому, що це процес в один крок.
slebetman

2
@ S.Lott: Більш відповідним першим коментарем було б: "логіка" апаратного забезпечення ретельно визначена і може бути вивчена окремо від апаратної. І справді це так. Вивчення бінарної логіки називається булевою алгеброю.
slebetman

6

Це все охоплене ретельним терпінням у книзі «Мистецтво комп’ютерного програмування» Дон Кнута.

Ефективні алгоритми додавання, віднімання, множення та ділення всі описані докладно.

Ви можете добре читати такі речі, які добре висвітлюють поділ.

http://research.microsoft.com/pubs/151917/divmodnote.pdf


5

Це робиться в пікосекундах електронними схемами. "Апаратний множник" Google тощо для отримання детальної інформації. Сучасні процесори - надзвичайно складний результат десятиліть постійного вдосконалення.

До речі, чому ви не помножуєте на повторне додавання, чому б ви могли уявити собі комп'ютер?


Моє запитання стосується міркування функцій, а не самих функцій, я розумію, що це інтерпретується процесором, мені цікаво, як. Зокрема, теорія, що стоїть за нею, і те, як це можна було б повторити в псевдокоді.
Корвін Сзанто

1
Множення, яке я роблю в голові, - це пам'ять. Також тривале множення вимагає ітерації так, як я це зробив. Я піду вперед і кину разом функцію для довгого множення
Корвін Сзанто,

2
@Korvin, книга, яку я рекомендував, буде служити вам добре, якщо це ваш інтерес. Я також рекомендую "Структура та інтерпретація комп'ютерних програм" Гарольда Абельсона та Джеральда Джея Суссмана. Ці питання вони розглядають глибоко.
Джонатан Хенсон,

Кілька ранніх комп'ютерів підтримували лише додавання і віднімання. Деякі підтримують лише віднімання! Таким чином, операція x = y * z була реалізована так, як do (z раз) {x + y} подібно до того, що поділ x = y / z було реалізовано, як і тоді, коли (y> z) {x + 1; y = y - z}
Джеймс Андерсон

@James: чи підтримували вони зміни? Я б очікував, що множення було здійснено за допомогою зсуву та додавання, тоді як ділення зміщувалося, порівнювало, віднімало.
кевін клайн

4

Це не означає, що будь-якою мірою є ґрунтовною відповіддю, але це повинно дати вам деяке уявлення про те, як реалізуються речі. Як ви, напевно, знаєте, числа представлені у двійкових формах. Наприклад, комп'ютер може представляти число 5 як 00000101. Дуже базовою операцією, яку може зробити комп’ютер, є зсув ліворуч, який би дав 00001010, що є десятковою 10. Якби двічі було зрушено праворуч, це було б 00010100 (десятковий 20). Кожен раз, коли ми зміщуємо цифри наліво 1 раз, ми подвоюємо число. Скажіть, у мене було число x, і я хотів помножити його на 17. Я міг змістити х вліво в 4 рази, а потім додати x до результату (16x + x = 17x). Це був би ефективний спосіб множення числа на 17. Це повинно дати вам деяке уявлення про те, як комп'ютер може перемножувати великі числа, не використовуючи лише повторне додавання.

Ділення може використовувати комбінації додавання, віднімання, зсуву вправо, зсуву вліво тощо. Існують також численні хитрощі для підняття чисел до експонентів.


Щоб було зрозуміло, ви, як правило, може змінюватись більше, ніж один біт. Таким чином , ці 4 операції зсуву, на самому ділі тільки одна операція, як: shl r0, 4.
Калеб

4

Будучи дитиною, я навчився розмножувати та ділити за допомогою пера та паперу, не витрачаючи часу на занадто багато доповнень. Пізніше я дізнався, що квадратні корені також можна обчислити.

В університеті я навчився обчислювати тригонометричні та логарифмічні операції з десятком множень, ділень та додавань. Вони називали це серією Тейлор.

До цього батько дав мені книгу, де ті складні операції вже були обчислені на сотні значень і представлені в таблицях. Було також кілька пояснень для оцінки помилки, коли потрібно було задати синус значення між двома обчисленими значеннями.

Цілі одиниці, одиниці з плаваючою комою, GPU і DSP просто реалізують всі ті старі методики на кремнії.


3

Я спробую дати вам уявлення про те, як розроблені цифрові мікросхеми для вирішення проблем цифрової обробки, використовуючи поставлені вами проблеми: як ЦП реалізують доповнення та множення.

По-перше, давайте не зможемо прямо вирішити питання: як мова програмування ефективно оцінює множення та додавання. Відповідь проста, вони складають їх у множення і додають інструкції. Наприклад, наступний код:

a = 1 + 1;
b = a * 20;

просто складено до чогось типу:

ADD 1 1  a
MUL a 20 b

(зауважте, що вищезгадана збірка призначена для уявного процесора, який не існує, для простоти).

У цей момент ви розумієте, що наведена відповідь просто зміщує проблему і вирішує її апаратною магією. Подальше питання, очевидно, як працює ця апаратна магія?

Розглянемо спочатку більш просту проблему: додавання.

Спочатку ми робимо звичну проблему, додаючи в звичайну базу 10 чисел:

 17
+28

Першим кроком було б додати 7 та 8. Але це призводить до 15, що більше однієї цифри. Отже, ми переносимо 1:

(1)
 17
+28
= 5

Тепер додаємо 1, 1 і 2 разом:

 17
+28
=45

Тож із цього ми отримуємо такі правила:

  1. коли результат додавання більше однієї цифри, ми зберігаємо найменш значну цифру і переносимо найбільш значну цифру вперед

  2. якщо у нас стовпчик переноситься в наш стовпчик, ми додаємо його разом із числами, які ми додаємо

Тепер настав час інтерпретувати вищезазначені правила у базі 2 - булева алгебра.

Отже, в булевій алгебрі додавання 0 і 1 разом = 1. Додавання 0 і 0 = 0. І додавання 1 і 1 = 10, що більше однієї цифри, тому ми переносимо 1 вперед.

З цього ми можемо побудувати таблицю істинності:

a b  |  sum  carry
-------------------
0 0  |   0     0
0 1  |   1     0
1 0  |   1     0
1 1  |   0     1

З цього ми можемо побудувати два рівняння / булеві рівняння - одне для виведення суми та одне для виведення переносу. Найнаївніший спосіб - просто перерахувати всі матеріали. Будь-яка таблиця істини, незалежно від того, наскільки велика і складна може бути перероблена у такому вигляді:

(AND inputs in first row) OR (AND of inputs in second row) OR ...

Це в основному сума форми продукції. Ми дивимося лише на результати, які призводять до значення 1, і ігноруємо 0:

sum = (NOT a AND b) OR (a AND NOT b)

Давайте замінимо І АБО І НЕ на символи мови програмування, щоб полегшити читання:

sum = (!a & b) | (a & !b)

В основному ми перетворили таблицю так:

a b  |  sum  equation
-------------------
0 0  |   0   
0 1  |   1   (!a & b)
1 0  |   1   (a & !b)
1 1  |   0   

Це можна безпосередньо реалізувати у вигляді схеми:

                _____
 a ------------|     |
    \          | AND |-.     ____
     \  ,-NOT--|_____|  \   |    |
      \/                 `--| OR |----- sum
      /\        _____    ,--|____|
     /  `-NOT--|     |  /
    /          | AND |-`
 b ------------|_____|

Читачі, які спостерігають за цим спостереженням, зауважили б, що вищезазначена логіка може бути реалізована як єдиний затвор - ворота XOR, які зручно мають поведінку, яку вимагає наша таблиця правдивості:

                _____
 a ------------|     |
               | XOR |---- sum
 b ------------|_____|

Але якщо ваше обладнання не надає вам ворота XOR, описані вище кроки - це, як ви б вирішили визначити та реалізувати його з точки зору воріт І, АБО та НЕ.

Спосіб перетворення логічних воріт у фактичне обладнання залежить від обладнання, яке ви маєте. Вони можуть бути реалізовані за допомогою різних фізичних механізмів до тих пір, поки механізм забезпечує певну поведінку комутації. Логічні ворота були реалізовані у всьому, від струменів води або затягування повітря (флюїди) до транзисторів (електроніки) до падіння мармуру. Сама по собі це велика тема, тому я збираюся просто промальовувати її і сказати, що можливо застосувати логічні ворота як фізичні пристрої.

Тепер ми робимо те ж саме для несучого сигналу. Оскільки існує лише одна умова, коли несучий сигнал є істинним, рівняння просто:

carry = a & b

Тож перевезти просто:

                _____
 a ------------|     |
               | AND |---- carry
 b ------------|_____|

Комбінуючи їх разом, ми отримуємо те, що відоме як напівсума:

                _____
 a ------;-----|     |
         |     | XOR |---- sum
 b --;---|-----|_____|
     |   |      _____
     |   '-----|     |
     |         | AND |---- carry
     '---------|_____|

Рівняння для наведеної схеми до речі виглядають так:

sum = a ^ b
carry = a & b

У половині суматора щось не вистачає. Ми застосували перше правило - якщо результат більше однієї цифри, ніж перенести вперед, але друге правило ми не реалізували - якщо є перенесення, додайте його разом із числами.

Отже, щоб реалізувати повний суматор, схему додавання, яка може додавати числа, що перевищують одну цифру, нам потрібно визначити таблицю істинності:

a b c  |  sum  carry
---------------------
0 0 0  |   0     0
0 0 1  |   1     0
0 1 0  |   1     0
0 1 1  |   0     1
1 0 0  |   1     0
1 0 1  |   0     1
1 1 0  |   0     1
1 1 1  |   1     1

Рівняння для суми тепер:

sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)

Ми можемо пройти той самий процес, щоб визначити і спростити рівняння і інтерпретувати його як ланцюг і т. Д., Як ми це робили вище, але я думаю, що ця відповідь стає надто довгою.

Ви вже маєте уявлення про те, як розроблена цифрова логіка. Є й інші хитрощі, про які я не згадував, такі як карти Карно (використовуються для спрощення таблиць істинності) та компілятори логіки, такі як еспресо (так що вам не доведеться вручну розбивати булеві рівняння), але основна в основному те, що я Викладено вище:

  1. Розв’яжіть проблему, поки ви не зможете працювати на рівні біт (цифр).

  2. Визначте результати, які ви хочете, використовуючи таблицю істинності.

  3. Перетворіть таблицю в булеві рівняння та спростіть рівняння.

  4. Інтерпретувати рівняння як логічні ворота.

  5. Перетворіть свою логічну схему в реальні апаратні схеми, застосувавши логічні ворота.

Ось як насправді вирішуються фундаментальні (точніше, низькорівневі) проблеми - багато та багато таблиць істини. Справжня творча робота полягає у розбитті складної задачі, такої як декодування MP3, до бітового рівня, щоб ви могли працювати над ним за допомогою таблиць правдивості.

Вибачте, у мене немає часу пояснювати, як реалізувати множення. Ви можете спробувати взяти тріщину, визначивши правила того, як довго працює множення, потім інтерпретуючи його у двійкові, а потім спробуйте розбити його на таблиці істинності. Або ви можете прочитати Вікіпедію: http://en.wikipedia.org/wiki/Binary_multiplier


2

основні арифметичні інструкції виконуються з інструкціями по збірці, які є високоефективними.

Більш складні (або абстрактні) вказівки виконуються або в комплекті з петельними механізмами, або обробляються в std libs.

Коли ви вивчаєте математику в коледжі, ви почнете вивчати такі речі, як обчислення Лямбди та позначення Big-O. Усі ці та багато іншого використовуються програмістами для оцінки та створення ефективних алгоритмів. У будь-якому разі, основний матеріал, як правило, виконується на низькому рівні, як, наприклад, у зборі або в c з покажчиками.

Чудовим вступом до цієї теми є «Код» Чарльза Петцольда.


1
Або таблиці пошуку. Набагато швидше попередньо обчислити значення та переглянути їх. Приклади Sin / Cos / Tan (ціле поділ, хоча це попередньо обчислюється і зберігається в апаратному забезпеченні).
Мартін Йорк

1

Отримайте книгу на кшталт " Основи цифрової логіки ..." , яка, на мою думку, все ще є досить стандартною для студентів першокурсника / Софомора, і працюйте над нею. це). Це допоможе вам пройти через суматори та множники, і ви отримаєте достатньо досвіду для того, щоб почати розуміти деякі принципи, за якими працює апаратне забезпечення.

За короткий термін ваша відповідь стане "тому, що вона поєднує незрозумілі фрагменти простішої логіки, щоб викликати цю складну поведінку", а не "тому, що це робить".

Якщо ви хочете спробувати зрозуміти всі принципи того, як компілюються та запускаються програми, перейдіть до цього спільно, щоб ви могли зрештою побачити, як усе зустрічається посередині.


1

Тут є багато хороших відповідей. Ви також почали з правильної ідеї: складні операції, такі як множення, будуються з більш простих операцій. Як ви здогадалися, існують швидші способи множення без інструкції множення, ніж використання серії доповнень. Будь-яке множення може бути реалізовано як сума менших множень, або як комбінація зсувів та доповнень. Приклади:

a = 5 + 5 + 5 + 5 + 5;           // 5*5, but takes 5 operations
b = (5 << 2) + 5;                // 5*5 in only 2 operations
c = (41 << 4) + (41 << 2) + 41   // 41*21 in 4 operations

Відділення також можна розділити на більш дрібні операції. XOR (^) - це вбудована інструкція для кожного процесора, який я коли-небудь переглядав, але навіть тому він може бути реалізований у вигляді комбінації І, АБО та НЕ.

Однак у мене є відчуття, що конкретні відповіді вам будуть менш задовольняти, ніж загальне уявлення про типи інструкцій, які надає процесор, і як ці інструкції можна поєднувати в більш складні операції. Немає нічого кращого для такої цікавості, ніж здорова доза мови мовлення. Ось дуже доступний вступ до мови складання MIPS.


1

Ось як сучасний процесор може реалізувати множення двох 64-бітних цілих чисел:

Ви знаєте, як зробити довге множення рук. Щоб помножити два десятизначні числа, ви помножили б одне десятицифрове число на кожну з 10 цифр іншого числа, записуйте результат 11 цифр одна під іншу і зміщуючи, а потім додаєте все число.

Сучасний процесор робить це з усіма 64 на 64 бітами. Однак множення двох одиничних розрядних чисел дуже просте: 1 х 1 = 1, усі інші добутки дорівнюють нулю. Це реалізовано з логічним і. І на відміну від десяткового добутку, де результат може бути двозначним, двійковий добуток одинарних чисел завжди є одним бітом.

Отже, у вас є 64 рядки з 64 біт, які потрібно додати. Але 64 доповнення 64-бітних чисел - slooooooow. Таким чином, процесор використовує або суматор 3/2, або 7/3-суматор: Якщо ви додасте 3 однорозрядних числа, результатом може бути 0, 1, 2 або 3, що відповідає двом бітам. Якщо додати 7 одиничних розрядних чисел, результат - це число від 0 до 7, яке може бути представлено 3 бітами. IBM стверджує, що вони можуть зробити 7/3 суматор із лише 18 примітивними схемами (документація PowerPC).

У вас 4096 біт, згрупуйте їх у близько 600 груп по 7 біт в однакових бітових положеннях і використовуйте близько 600 7/3 суматорів, щоб зменшити результат з 4096 біт до менш ніж 2000. Потім ви робите те саме знову і знову, поки не закінчите з парними шматочками, які можна подати в звичайний повний суматор.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.