На этом шаге мы рассмотрим перевод дробных чисел из одной системы счисления в другую.
Вещественное число, в общем случае содержащее целую и дробную часть, всегда можно представить в виде суммы целого числа и правильной дроби. Поскольку в предыдущем шаге проблема записи натуральных чисел в различных системах счисления уже была решена, можно ограничить рассмотрение только алгоритмами перевода правильных дробей. Введем следующие обозначения: правильную дробь в исходной системе счисления p будем записывать в виде 0,Yp, дробь в системе q – 0,Yq, а преобразование – в виде 0,Yp 0,Yq. Последовательность рассуждений весьма напоминает проведенную ранее для натуральных чисел. В частности, это касается рекомендации осуществлять преобразование через промежуточный переход к 10-й системе, чтобы избежать необходимости производить вычисления в "непривычных" системах счисления, т.е. 0,Yp0,Y10 0,Yq. Это, в свою очередь, разбивает задачу на две составляющие: преобразование 0,Yp 0,Y10 и 0,Y100,Yq, каждое из которых может рассматриваться независимо.
Алгоритмы перевода 0,Y10 0,Yq выводится путем следующих рассуждений. Если основание системы счисления q, простая дробь содержит n цифр и bk – цифры дроби (1k 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.
Как уже было сказано, значение целого числа не зависит от формы его представления и выражает количество входящих в него единиц. Простая дробь имеет смысл доли единицы, и это "дольное" содержание также не зависит от выбора способа представления. Другими словами, треть пирога остается третью в любой системе счисления.
На следующем шаге мы рассмотрим понятие экономичности системы счисления.