Страницы

Деление десятичных чисел

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

Для операции деления принята следующая терминология.

  • Делимое (Numerator или Divident) — это то число, которое мы делим

  • Делитель (Denumerator или Divisor) — это то число на которое мы делим

  • Частное (Quotient) — это результат деления

  • Остаток (Remainder) — это остаток от деления

Деление десятичных чисел

Рассмотрим пример деления десятичных чисел. Зададим делимое и делитель и получим результат деления — частное и остаток.

Деление
Делимое (Numerator/Divident)10
Делитель (Denumerator/Divisor)10
Частное (Quotient)10
Остаток (Remainder)10

Разберем операцию деления подробнее и вспомним алгоритм деления, который мы учили в школе:

  1. В ходе алгоритма исходное делимое N преобразуется в остаток от деления R. Присваиваем R = N

  2. Смотрим на первую цифру R и пробуем подобрать число, которое при умножении на делитель D будет маскимально близко к первой цифре

  3. Если такое число удалось подобрать, то результат деления — это будет первая цифра результата нашей операции — Q

  4. Вычитаем из первой цифры R полученную цифру, результат записываем в R опять (частичный остаток)

  5. Если такое число подобрать не удается (первая цифра меньше, чем делитель), то первая цифра результата будет равна 0

  6. Далее повторяем эти операции над полученным частичным остатком, пока остаток не станет меньше делимого

 Деление по шагам 

Записываем то же самое в строчку для того, чтобы удобнее было вывести рекуррентную формулу.

 Деление по шагам 

Выделенные цифры — это частное (результат операции деления)

Ниже приведена программа на языке С, которая реализовывает этот алгоритм. Алгоритм приведен исключительно в образовательных целях. Его применение на практике не имеет смысла хотя бы по той причине, что в нем самом используется команда деления на 10 и трансцендентные функции log10f, powf. Далее мы рассмотрим алгоритм деления двоичных чисел, который будет проще понять после этого примера.

#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, которая вычисляет частное (Q) и остаток (R). В самом начале функции деления проверяется не равен ли нулю делитель. Операция деления не имеет смысла, если делитель равен нулю. Начальное значение переменной step выбирается так, чтобы количество цифр совпадало с количеством цифр делимого.

Для 32-ух разрядных чисел (sizeof(unsigned int)=32) можно использовать константу 108 вместо вычисления (int)powf(10,(int)log10f(N)). Для контроля правильности выполнения деления последней командой восстанавливается исходное значение делимого (N).

Следует отметить, что этот алгоритм работает только для положительных чисел. Реализацию деления отрицательных чисел мы рассмотрим позже.