Як відбувається поділ у наших комп’ютерах?


17

Як відбувається поділ всередині цифрових комп'ютерів? Який алгоритм для нього?

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


1
@ program-o-steve Відділення в АЛУ - це складна операція. Ви не отримаєте "просту" блок-схему.
Маєнко

5
@ Леон Хеллер О! Це не говорить так. Це чисто технічне питання
програма-o-steve

2
@ Леон Хеллер, я думаю, це не ...., до яких належать електроніка, фізичні обчислення ...
program-o-steve

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

4
@LeonHeller Я зазвичай погоджуюся з питаннями, які ви хочете закрити, але дизайн процесора - це питання електротехніки. Це питання може використати деяку допомогу, щоб зробити його більш зрозумілим, що потрібно (наприклад, про що запитує konsalik), але це не робить це поза темою.
Kellenjb

Відповіді:


17

Алгоритми поділу в цифрових конструкціях можна розділити на дві основні категорії. Повільний поділ і швидкий поділ.

Я пропоную вам почитати про те, як працюють двійкові додавання і віднімання, якщо ви ще не знайомі з цими поняттями.

Повільний відділ

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

Приклад:

7/3:

  1. 7-3=4
  2. 4-3=1
  3. 1<3

Таким чином, відповідь 2 з залишком 1. Щоб зробити цю відповідь трохи більш актуальною, ось деяка інформація. Двійкове віднімання через додавання від’ємника виконується, наприклад: 7 - 3 = 7 + (-3). Це здійснюється за допомогою доповнення двох своїх. Кожне двійкове число додається за допомогою серії повних суматорів:

введіть тут опис зображення

Якщо кожен 1-бітний повний суматор реалізується наступним чином:

введіть тут опис зображення

Швидкий відділ

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

Розглянемо метод Гольдшмідта:

Q=ND

Цей метод працює наступним чином:

  1. Помножте N і D на дріб F таким чином, що D наближається до 1.
  2. У міру наближення D 1 N підходить до Q

Цей метод використовує двійкове множення за допомогою ітеративного додавання, яке також використовується в сучасних процесорах AMD.


1
Деякі діаграми послідовності змін варіантів методу «повільний» (реалізовані в зборах на мікросередовищах без апаратного поділу, але все ще корисні) наведені в додатку AVR200 Atmel в Atmel .
Кевін Вермер

ви можете, будь ласка, надати ілюстрацію про метод поділу Гольдшмідта. Також наведена тут схема діаграм є прикладом повільного поділу?
програма-o-steve

що це за метод, у якому нам доведеться неодноразово переводити дивіденд вліво?
програма-o-steve

@ program-o-steve Ось коротка ілюстрація: знайдіть 22/7 (наближення пі). По-перше, помножте верх і низ на 0,1, щоб отримати: 2,2 / 0,7 Помножте ще раз, використовуючи 1,3, даючи: 2,86 / 0,91 Використання 1,09 дає: 3,1177 / 0,9919 1,008 дає: 3,1423393 / 0,9998352 Продовжуйте рухатися, незабаром ви дійдете до КРАЙНОГО ВІДПОВІДУ 3.1428571 / 1.000000 ...
Алан Кемпбелл

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

5

Обладнання для поділу з плаваючою комою є частиною логічної одиниці, яка також робить множення; доступний апаратний модуль мультиплікатора. Числа з плаваючою комою, скажімо, A і B, діляться (утворюючи A / B) на

  1. розкладання чисел з плаваючою комою на знаки (+1 або -1), мантіси ("a" і "b", (binary type integer type))
  2. знак результату (+1), якщо обидва знаки однакові, інше (-1)
  3. експоненти віднімаються (показник В віднімається від експонента А), щоб утворити показник результату
  4. mantissas (двійкові цифри чисел) - двійкове число з фіксованою точкою між 1/2 та 1; це означає, що перша цифра після двійкової точки - «1», а потім нулі та одиниці ... як перший крок, таблиця пошуку знаходить зворотну точність до шести біт (є лише 32 можливості, це невелика таблиця)

  5. аб=аrеciprоcал(б)бrеciprоcал(б)
    і зауважте, що шестибітна точність означає, що знаменник результату знаходиться дуже близько 1 (до п'яти і більше двійкових місць).

  6. Тепер зауважимо, що для дуже близьких знаменників «d» ми можемо побачити це визначення
    г==1+ϵ
    г(2-г)=(1+ϵ)×(1-ϵ)=1-ϵ2
    Це означає, що наш п’ятибітовий точний 'один' у знаменнику стане десятирозрядним точним після ще однієї пари множень, двадцятибітової точної після двох та сорока бітової точної після трьох. Зробіть стільки ітерацій множення чисельника і знаменника на (2 - знаменник), скільки вимагає точність результату.
  7. Чисельник, тепер, коли знаменник є точно «1», є мантією результату, і його можна поєднувати з раніше обчисленими знаком і експонентом.
  8. IEEE з плаваючою точкою допускає деякі винятки (денормалізовані числа, NAN; їх потрібно обробляти іншими логічними операціями.

Цікаво, що стара помилка розділення Pentium (дуже важлива для новин у 1994 р.) Була спричинена помилкою друку, яка зробила помилкові значення взаємної таблиці для кроку (4). Рання стаття, "Метод поділу за допомогою паралельного множника", Доменіко Феррарі, IEEE Trans. Електрон. Обчислення. EC-16 / 224-228 (1967) описує метод так само, як і "IBM System / 360 Модель 91: блок виконання плаваючої точки" IBM J. Res. Дев. 11 : 34–53 (1967).


1

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

Розрахунок зворотного знаменника не так вже й поганий; це робиться шляхом уточнення послідовних наближень. Нехай g - ваша здогадка протягом 1 / д. Для покращення здогадки використовуйте g '= g (2-gd). Це сходить квадратично, тож ви подвоюєте цифри точності за кожне вдосконалення.

Приклад: обчислити зворотну величину 3,5.

Ваша початкова здогадка - 0,3. Ви обчислюєте 0,3 * 3,5 = 1,15. Ваша скоригована здогадка - 0,3 * (2 - 1,15) = 0,285. Вже досить близько! Повторіть процес, і ви отримаєте 0,2857125, а третя спроба отримає 0,2857142857.

Є кілька ярликів. У плаваючій точці ви можете витягнути потужність десять або дві потужності, залежно від кількості номерів вашої машини. І, для швидкості за рахунок більшого використання пам'яті, ви можете використовувати попередньо обчислену таблицю для чисел у межах від 1 до b (де b - ваша база чисел), щоб отримати здогадку, що відразу наближається до необхідної взаємної та збережіть один або два етапи вдосконалення.

Майте на увазі, що, як і при множенні та збентеженні Колмогорова 1960 року його студентом Анатолієм Карацубою, ви ніколи не знаєте, коли буде знайдений швидший чи кращий метод. Ніколи не здавайся цікавості.


-1

Комп'ютери не роблять ітеративного доповнення для множення чисел - це було б дуже повільно. Натомість існує кілька алгоритмів швидкого множення. Перевірте: http://en.wikipedia.org/wiki/Karatsuba_algorithm


Ласкаво просимо на EE.SE. Відповіді, що стосуються лише посилань, не враховують. Будь ласка, узагальніть інформацію за посиланням.
Недійсне

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