Главная » Free Pascal » Внутренний формат числовых данных

0

Под внутренним форматом имеется в виду машинное представление числовой информации. Мы уже упоминали, что в оперативной памяти компьютера числовые данные представлены в двоичной системе. Для целых положительных чисел это представление может быть записано следующим образом:

N    bk bk  1bk

2…b2b1b0.

Здесь b j

— двоичная цифра, принимающая значение 1 или 0 в зависимости от

того, присутствует или не присутствует слагаемое  2 j

в разложении числа N. Для

нахождения двоичных цифр в разложении числа N можно записать:

k                    k  1

k  2                         2               1               0

N    bk   2

bk  1   2

bk  2

2        …

b2   2

b1   2

b0   2  .

Очевидно, что после деления числа N на 2 степень первых k слагаемых пони-

зится на 1, а в остатке окажется цифра

b0 . Если частное от первого деления вновь

разделить на 2, то следующий остаток будет равен цифре

b1 . Так продолжают до

тех пор, пока очередное частное не окажется равным 0. Последующие деления на 2 ничего кроме нулевого частного и нулевого остатка давать не будут. Так как лиди- рующие нули нас не интересуют, то процедура перевода целого числа в двоичную

систему завершается. Продемонстрируем этот алгоритм на примере N

± первое деление на 2:         частное = 28    остаток = 1 (цифра b0 );

± второе деление на 2:         частное = 14    остаток = 0 (цифра b1 );

± третье деление на 2:         частное = 7      остаток = 0 (цифра b2 );

± четвертое деление на 2:    частное = 3      остаток = 1 (цифра b3 );

± пятое деление на 2:           частное = 1      остаток = 1 (цифра b4 );

± шестое деление на 2:        частное = 0      остаток = 1 (цифра b5 ).

57 :

Таким образом, 5710

1110012 .

Если число N — дробное, то его двоичное представление выглядит так:

N    0.b 1b 2b 3…

Это равенство можно переписать в следующем виде:

1                    2                    3

N    b 1   2

b 2   2

b 3   2      …

Если эту сумму умножить на 2, то в разряде целых окажется цифра

b 1 , а сте-

пени всех остальных слагаемых в дробной части повысятся на 1. Повторное умно-

жение новой дробной части переведет в разряд целых цифру

b 2 . Этот процесс

может закончиться естественным образом, когда очередная дробная часть окажется равной 0. Но может и не закончиться, т. к. дробные части могут периодически по- вторяться. В этом случае процесс перевода завершают по достижении требуемого количества дробных разрядов. Продемонстрируем этот алгоритм на примерах.

Для N1=0.75:

± первое умножение N1 на 2: дробная часть = 0.5  целая часть = 1 (цифра 1 );

± второе умножение на 2:      дробная часть = 0     целая часть = 1 (цифра 2 ).

Таким образом,  0.7510

0.112 .

Теперь для N2=0.2:

± первое умножение N2 на 2:

дробная часть = 0.4

целая часть = 0;

± второе умножение на 2:

дробная часть = 0.8

целая часть = 0;

± третье умножение на 2:

дробная часть = 0.6

целая часть = 1;

± четвертое умножение на 2:

дробная часть = 0.2

целая часть = 1;

± пятое умножение на 2:

дробная часть = 0.4

целая часть = 0.

(начинается периодическое повторение).

Таким образом, 0.210

0.0011001100110011…2  .

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

Если вещественное число N содержит и целую часть, и дробную, то каждую из них переводят в двоичную систему по описанным выше алгоритмам, а потом их

объединяют. Например,  57.7510

111001.112 .

Опытные программисты используют более эффективный способ перевода. Сначала десятичные числа переводят в шестнадцатеричную систему (целые — пу- тем деления на 16, дробные — путем умножения на 16), а затем каждую шестна- дцатеричную цифру заменяют ее четырехразрядным двоичным эквивалентом. На- пример, число 57 переводят следующим образом:

± первое деление на 16:

частное = 3

остаток = 9 (двоичный код — 1001);

± второе деление на 16: Результат: 00111001.

частное = 0

остаток = 3 (двоичный код — 0011).

При переводе дроби 0.2 период наблюдается после первого же умножения:

первое умножение на 16:    дробная часть = 0.2     целая часть = 3. Результат: 0.(0011).

Наконец, самые ленивые пользователи для перевода целых чисел могут при- бегнуть к услугам калькулятора Windows (рис. 4.3).

Вещественные числа хранятся в оперативной памяти компьютера в виде двух компонентов — значащих цифр числа (так называемой мантиссы) и множителя (двоичного порядка). В IBM-совместимых компьютерах мантисса обычно находит- ся в диапазоне (2, 1] или (1, 0.5]. При таком выборе происходит минимальная поте- ря точности. Такую мантиссу принято называть нормализованной. Обозначим знак числа через s, мантиссу через m, а порядок числа через p. Тогда вещественное чис- ло N можно представить в следующем виде:

N    (  1)s

2 p .

Рис. 4.3. Перевод целых чисел в двоичную систему с помощью калькулятора

Для хранения знака числа отводится один двоичный разряд, который равен 1 для отрицательных чисел и 0 — для положительных. Порядок числа (вместе со своим знаком) в зависимости от выбранного машинного формата занимает от 8 до 15 дво- ичных разрядов. Остальные разряды заняты мантиссой. Но и тут не обошлось без приятного пустячка. Так как у чисел, отличных от 0, старший разряд нормализо- ванной мантиссы равен 1, то в оперативной памяти его не хранят. Когда вещест- венные операнды извлекаются из оперативной памяти в регистры микропроцессо- ра, то старшую единицу мантиссы восстанавливают. Хранение старшего бита нормализованной мантиссы "в уме" позволяет хранить в оперативной памяти лиш- ний двоичный разряд мантиссы, увеличивая тем самым точность ее представления.

Название "формат с плавающей точкой" (floating point) обязано своим проис- хождением тому обстоятельству, что умножение мантиссы на порядок (степень двойки) вызывает перемещение точки (ее положение в мантиссе фиксировано) вправо (при положительном порядке) или влево (при отрицательном порядке).

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии