На этом шаге мы рассмотрим перевод дробных чисел из одной системы счисления в другую.
Вещественное число, в общем случае
содержащее целую и дробную часть, всегда можно представить в виде суммы целого
числа и правильной дроби. Поскольку в предыдущем шаге проблема записи
натуральных чисел в различных системах счисления уже была решена, можно
ограничить рассмотрение только алгоритмами перевода правильных дробей. Введем
следующие обозначения: правильную дробь в исходной системе счисления
p будем записывать в виде 0,Yp, дробь в системе q – 0,Yq, а
преобразование – в виде 0,Yp
0,Yq.
Последовательность рассуждений весьма напоминает проведенную ранее для
натуральных чисел. В частности, это касается рекомендации осуществлять
преобразование через промежуточный переход к 10-й системе, чтобы избежать
необходимости производить вычисления в "непривычных" системах счисления, т.е.
0,Yp
0,Y10
0,Yq.
Это, в свою очередь, разбивает задачу на две составляющие: преобразование 0,Yp
0,Y10
и 0,Y10
0,Yq,
каждое из которых может рассматриваться независимо.
Алгоритмы перевода 0,Y10
0,Yq
выводится путем следующих рассуждений. Если основание системы счисления q,
простая дробь содержит n цифр и bk – цифры дроби
(1
k
n, 0
bk
q–1), то
она может быть представлена в виде суммы:
(5)
Часть дроби от разряда i до ее конца
обозначим i
и примем
n
= bn/q (очевидно,
1
= 0,Yq); тогда в (5)
легко усматривается рекуррентное соотношение:
(6)
Если вновь позаимствовать в PASCAL’е обозначение функции – на этот раз trunc, которая производит округление целого вещественного числа путем отбрасывания его дробной части, то следствием (6) будут соотношения, позволяющие находить цифры новой дроби:
bi = trunc(q·i),
i+1
= q·
i
- trunc(q·
i) (7)
Соотношения (7) задают алгоритм преобразования 0,Y10
0,Yq:
Блок-схема алгоритма представлена на рисунке 1. Цикл перевода заканчивается либо
в том случае, когда окажется
i+1
= 0, либо последовательность действий повторится наперед заданное число раз
(значение константы ex), которое совпадает с количеством значащих цифр в
дробной части.
Рис.1. Блок-схема алгоритма
Таким образом, 0,37510 = 0,0112.
Перевод 0,Yp0,Y10, как
и в случае натуральных чисел, сводится к вычислению значения формы
(5) в десятичной системе счисления. Например,
0,0112 = 0·2-1 + 1·2-2 + 1·2-3 = 0,25 + 0,125 = 0,37510
Следует сознавать, что после перевода дроби, которая была конечной в исходной системе счисления, она может оказаться бесконечной в новой системе. Соответственно, рациональное число в исходной системе может после перехода превратиться в иррациональное. Справедливо и обратное утверждение: число иррациональное в исходной системе счисления в иной системе может оказаться рациональным.
Перевод целой части, очевидно, дает: 510 = 123. Перевод дробной части: 0,3(3)10 = 0,13. Окончательно: 5,3(3)10 = 12,13.
Как уже было сказано, значение целого числа не зависит от формы его представления и выражает количество входящих в него единиц. Простая дробь имеет смысл доли единицы, и это "дольное" содержание также не зависит от выбора способа представления. Другими словами, треть пирога остается третью в любой системе счисления.
На следующем шаге мы рассмотрим понятие экономичности системы счисления.