Як відбувається поділ всередині цифрових комп'ютерів? Який алгоритм для нього?
Я важко шукав у Google, але не мав задовільних результатів. Будь ласка, надайте дуже чіткий алгоритм / блок-схему алгоритму поділу з прикладом ілюстрації.
Як відбувається поділ всередині цифрових комп'ютерів? Який алгоритм для нього?
Я важко шукав у Google, але не мав задовільних результатів. Будь ласка, надайте дуже чіткий алгоритм / блок-схему алгоритму поділу з прикладом ілюстрації.
Відповіді:
Алгоритми поділу в цифрових конструкціях можна розділити на дві основні категорії. Повільний поділ і швидкий поділ.
Я пропоную вам почитати про те, як працюють двійкові додавання і віднімання, якщо ви ще не знайомі з цими поняттями.
Повільний відділ
Усі найпростіші повільні методи працюють наступним чином: Віднімайте знаменник від чисельника. Зробіть це рекурсивно з результатом кожного віднімання, поки залишок не буде меншим від знаменника. Сума ітерацій є цілим коефіцієнтом, а залишкова сума - залишком.
Приклад:
7/3:
Таким чином, відповідь 2 з залишком 1. Щоб зробити цю відповідь трохи більш актуальною, ось деяка інформація. Двійкове віднімання через додавання від’ємника виконується, наприклад: 7 - 3 = 7 + (-3). Це здійснюється за допомогою доповнення двох своїх. Кожне двійкове число додається за допомогою серії повних суматорів:
Якщо кожен 1-бітний повний суматор реалізується наступним чином:
Швидкий відділ
Хоча повільніший спосіб ділення легко зрозуміти, він вимагає повторюваних ітерацій. Існують різні "швидкі" алгоритми, але всі вони покладаються на оцінку.
Розглянемо метод Гольдшмідта:
Цей метод працює наступним чином:
Цей метод використовує двійкове множення за допомогою ітеративного додавання, яке також використовується в сучасних процесорах AMD.
Обладнання для поділу з плаваючою комою є частиною логічної одиниці, яка також робить множення; доступний апаратний модуль мультиплікатора. Числа з плаваючою комою, скажімо, A і B, діляться (утворюючи A / B) на
mantissas (двійкові цифри чисел) - двійкове число з фіксованою точкою між 1/2 та 1; це означає, що перша цифра після двійкової точки - «1», а потім нулі та одиниці ... як перший крок, таблиця пошуку знаходить зворотну точність до шести біт (є лише 32 можливості, це невелика таблиця)
Цікаво, що стара помилка розділення Pentium (дуже важлива для новин у 1994 р.) Була спричинена помилкою друку, яка зробила помилкові значення взаємної таблиці для кроку (4). Рання стаття, "Метод поділу за допомогою паралельного множника", Доменіко Феррарі, IEEE Trans. Електрон. Обчислення. EC-16 / 224-228 (1967) описує метод так само, як і "IBM System / 360 Модель 91: блок виконання плаваючої точки" IBM J. Res. Дев. 11 : 34–53 (1967).
Існують дуже різні методи поділу, залежно від чисел, якими потрібно обробити. Для цілих чисел метод зрушення та віднімання, який надають інші, буде добре працювати. Щодо чисел з плаваючою комою, однак, може бути швидше спочатку обчислити зворотний знаменник, а потім помножити, що перевищує ваш чисельник.
Розрахунок зворотного знаменника не так вже й поганий; це робиться шляхом уточнення послідовних наближень. Нехай 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 року його студентом Анатолієм Карацубою, ви ніколи не знаєте, коли буде знайдений швидший чи кращий метод. Ніколи не здавайся цікавості.
Комп'ютери не роблять ітеративного доповнення для множення чисел - це було б дуже повільно. Натомість існує кілька алгоритмів швидкого множення. Перевірте: http://en.wikipedia.org/wiki/Karatsuba_algorithm