Вещественное число X может быть представлено в 2-ух формах — естественной и нормализованной. В естественной форме у 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 (т.е. 1-ая означающая цифра мантиссы всегда ненулевая), а показатель степени представляется в системе р (kp). К примеру, для р = 2:
Мантисса размещается в промежутке 0,12 ≤ М2 < 1, что соответствует десятичному интервалу 0,510 ≤ M10 < 1.
Подобно задачке о преобразовании целых и дробных чисел, можно поставить задачку о преобразовании представления числа в нормализованной форме в системе счисления р к нормализованному представлению в системе q. Практическое значение такового преобразование заключается в том, что, как было сказано, в компьютере все вещественные числа хранятся и обрабатываются в нормализованном двоичном представлении и, как следует, при их вводе осуществляется перевод Х10 → Х2, а при выводе — оборотный перевод Х2 → Х10. Но до этого, чем дискуссировать таковой перевод, нужно разглядеть, как делается преобразование вещественного числа из естественной формы к нормализованному виду.
При нормализации различаются ситуации Хр > 1 и Хр < р-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 до того времени, пока 1-ая цифра после разделителя станет ненулевой. К примеру, N→[(0,000101∙2-101)2] = 0,101∙2-1000; N→[(0,000987)10] = 0,98710∙10-3. Общий метод нормализации можно изобразить в виде блок-«нормализация вправо» (N→), обеспечивающая нормализацию чисел наименьших р-1; разумеется, такие числа нужно множить на р с одновременным уменьшением показателя на 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, во 2-м — напротив. Всякий раз при умножении либо делении на р показатель kp будет поменять собственный значение на 1; продолжать деяния следует до того времени, пока не выполнится условие kp = 0. Метод действий для ситуации kp ≥ 0 представлен на рис.4.5.