Вещественное число X может быть представлено в двух формах - естественной и нормализованной. В естественной форме у X имеется целая и дробная части, между которыми помещается разделитель (запятая или точка), например 123,4567. Однако такая запись неудобна для слишком больших или, наоборот, слишком малых чисел. Кроме того, использование такой формы (она называется также «представление числа с фиксированной запятой») в компьютере вызвало бы снижение точности вычислений из-за необходимости приведения в соответствие разрядов обрабатываемых чисел и связанных с этим округлений или могло бы породить ситуацию, называемую переполнением, когда старший разряд числа не умещается в отведенной разрядной сетке. По указанным причинам вещественные числа в компьютере представляются в нормализованном виде (другое название - «представление числа с плавающей запятой»), главным достоинством которой является автоматическое масштабирование числа на каждом этапе обработки, что, с одной стороны, обеспечивает максимально возможную точность вычислений, а с другой - избавляет от необходимости принимать меры по предотвращению переполнения (за исключением достаточно экзотических ситуаций с выходом числа за отведенную разрядную сетку). По сути, это универсальная форма записи всех чисел, кроме определенных как «тип: целые» (например, Integer, Word или Byte в PASCAL'e).
Сначала познакомимся с необходимыми понятиями применительно к 10-ной системе счисления.
Число Х10 называется нормализованным,если оно представлено в виде Х10 = ± M10 ∙ 10±k10.
В этой записи М10 называется мантиссой нормализованного числа; значения мантиссы лежат в интервале 0,1 ≤ М10 ≤ 1. k10 называется порядком нормализованного числа - это целое положительное десятичное число. Примеры: -123410 = -0,1234∙104; 0,0345610 = 0,3456∙10-1.
Понятие нормализованного числа следует отличать от понятия числа в нормальной форме; данная форма достаточно часто используется при записи чисел в математике, физике, технических дисциплинах и отличается от нормализованного представления тем, что мантисса лежит в интервале 1 ≤ M10 < 10, например, kБ = 1,38∙10-23.
При нормализации происходит расчленение «составляющих» числа с выделением знака числа, мантиссы, знака порядка и порядка - как будет показано ниже, это создает определенные удобства при хранении и обработке чисел в компьютере.
Аналогично нормализации десятичного числа можно в нормализованной форме представить и число в произвольной системе счисления р:
При этом значения мантиссы лежат в интервале р-1 ≤ Мр < 1 (т.е. первая значащая цифра мантиссы всегда ненулевая), а показатель степени представляется в системе р (kp). Например, для р = 2:
Мантисса располагается в промежутке 0,12 ≤ М2 < 1, что соответствует десятичному интервалу 0,510 ≤ M10 < 1.
Подобно задаче о преобразовании целых и дробных чисел, можно поставить задачу о преобразовании представления числа в нормализованной форме в системе счисления р к нормализованному представлению в системе q. Практическое значение такого преобразование состоит в том, что, как было сказано, в компьютере все вещественные числа хранятся и обрабатываются в нормализованном двоичном представлении и, следовательно, при их вводе осуществляется перевод Х10 → Х2, а при выводе - обратный перевод Х2 → Х10. Однако прежде, чем обсуждать такой перевод, необходимо рассмотреть, как производится преобразование вещественного числа из естественной формы к нормализованному виду.
При нормализации различаются ситуации Хр > 1 и Хр < р-1. В первом случае для нормализации необходимо перемещать разделитель разрядов влево по числу до тех пор, пока не исчезнет целая часть числа, но первая цифра после разделителя будет ненулевой; каждое перемещение разделителя на 1 разряд влево эквивалентно делению числа на р и, чтобы число не менялось, показатель должен возрастать на единицу при каждом сдвиге. Если обозначить эту операцию N← (будем называть ее «нормализация влево»), то N←[(123,45)10] = 0,1234510∙103; N←[(23,4∙105)10] = 0,23410∙107; N←[(1212,2)3] = 0,121223∙311. Аналогично можно ввести операцию «нормализация вправо» (N→), обеспечивающая нормализацию чисел меньших р-1; очевидно, такие числа необходимо умножать на р с одновременным уменьшением показателя на 1 до тех пор, пока первая цифра после разделителя станет ненулевой. Например, N→[(0,000101∙2-101)2] = 0,101∙2-1000; N→[(0,000987)10] = 0,98710∙10-3. Общий алгоритм нормализации можно изобразить в виде блок-«нормализация вправо» (N→), обеспечивающая нормализацию чисел меньших р-1; очевидно, такие числа необходимо умножать на р с одновременным уменьшением показателя на 1 до тех пор, пока первая цифра после разделителя станет ненулевой. Например, N→[(0,000101∙2-101)2] = 0,101∙2-1000; N→[(0,000987)10] = 0,98710∙10-3. Общий алгоритм нормализации можно изобразить в виде блок-схемы на рис. 4.4.
При практической реализации данного алгоритма не следует забывать, что изменение значения kp на 1 должно производиться по правилам арифметики системы счисления р. В дальнейшем при необходимости проведения нормализации в ходе каких-либо преобразований будем просто ссылаться на приведенный алгоритм как готовый модуль.
Вернемся к задаче перевода нормализованного числа из одной сиcтемы счисления в другую. Пусть, имеется число Хр = ±Мр ∙ р±kp для которого необходимо найти соответствующее ему Xq = ±Mq ∙ р±kq . Представляется достаточно очевидным, что преобразование не затронет знаков мантиссы и показателя степени. Таким образом, для осуществления преобразования необходимо установить соответствие между (Мр, kp) и (Mq, kq). Оно получается достаточно просто, исходя из того, что Хр = Xq, откуда следует:
Из (4.13) вытекает, что для осуществления преобразования можно Мр умножить на рkp , т.е. перейти к естественной форме числа в системе р, перевести его в систему q, а затем нормализовать. Однако в таком варианте действий теряется точность числа и возможно переполнение на промежуточных этапах преобразования. Во избежание этого необходимо чередовать умножение (или деление) на р и нормализацию по основанию q. При этом, поскольку все операции выполняются по правилам арифметики в системе р, будут получены не (Mq, kq) в окончательном варианте, а их представления в системе р - обозначим их (Mq)p и (kq)p, которые затем нужно будет перевести в систему q. Различаются также ситуации kp ≥ 0 и kp < 0 - в первом случае необходимо умножать начальное и промежуточные значения мантиссы на р и для нормализации делить на q, во втором - наоборот. Каждый раз при умножении или делении на р показатель kp будет менять свой значение на 1; продолжать действия следует до тех пор, пока не выполнится условие kp = 0. Алгоритм действий для ситуации kp ≥ 0 представлен на рис.4.5.