В разных процессорах реализованы различные возможности по реализации арифметической операции деление. В некоторых процессорах операция деления реализована полностью и вызывается одной командой. В некоторых есть операции, которые облегчают реализацию деления, а в простых процессорах совсем нет таких команд.
Для операции деления принята следующая терминология.
Делимое (Numerator или Divident) — это то число, которое мы делим
Делитель (Denumerator или Divisor) — это то число на которое мы делим
Частное (Quotient) — это результат деления
Остаток (Remainder) — это остаток от деления
Деление десятичных чисел
Рассмотрим пример деления десятичных чисел. Зададим делимое и делитель и получим результат деления — частное и остаток.
Делимое (Numerator/Divident)10 | |
Делитель (Denumerator/Divisor)10 | |
Частное (Quotient)10 | |
Остаток (Remainder)10 |
Разберем операцию деления подробнее и вспомним алгоритм деления, который мы учили в школе:
В ходе алгоритма исходное делимое N преобразуется в остаток от деления R. Присваиваем
R = N Смотрим на первую цифру R и пробуем подобрать число, которое при умножении на делитель D будет маскимально близко к первой цифре
Если такое число удалось подобрать, то результат деления — это будет первая цифра результата нашей
операции — Q Вычитаем из первой цифры R полученную цифру, результат записываем в R опять (частичный остаток)
Если такое число подобрать не удается (первая цифра меньше, чем делитель), то первая цифра результата будет равна 0
Далее повторяем эти операции над полученным частичным остатком, пока остаток не станет меньше делимого
Записываем то же самое в строчку для того, чтобы удобнее было вывести рекуррентную формулу.
Выделенные цифры — это частное (результат операции деления)
Ниже приведена программа на языке С, которая реализовывает этот алгоритм. Алгоритм приведен исключительно в образовательных целях. Его применение на практике не имеет смысла хотя бы по той причине, что в нем самом используется команда деления на 10 и трансцендентные функции
#include <stdio.h> #include <math.h> unsigned int div10(unsigned int N, unsigned int D) { unsigned int Q, R, step; int Z, i; if(0 == D) { return 0; } R = N; Q = 0; step = (int)powf(10,(int)log10f(N)); for(; step > 0; step /= 10) { for(i = 0; i < 10; ++i) { Z = R - D * step; if(Z < 0) break; R = Z; } Q += i * step; } return Q*D+R; } void main() { unsigned int r; r = div10(,); printf("%u\n",r); }
В программе реализована функция div10, которая вычисляет
Для 32-ух разрядных чисел (sizeof(unsigned int)=32) можно использовать константу 108 вместо вычисления
Следует отметить, что этот алгоритм работает только для положительных чисел. Реализацию деления отрицательных чисел мы рассмотрим позже.