Планирование уроков на учебный год (по учебнику К.Ю. Полякова, Е.А. Еремина, полный углубленный курс, 4 часа в неделю)



Урок 31 - 35
Хранение в памяти целых и вещественных чисел. Арифметические и логические (битовые) операции. Маски
§26. Особенности представления чисел в компьютере. §27. Хранение в памяти целых чисел. § 28. Операции с целыми числами. §29. Хранение в памяти вещественных чисел




Содержание урока

§26. Особенности представления чисел в компьютере
§27. Хранение в памяти целых чисел
§28. Операции с целыми числами
§29. Хранение в памяти вещественных чисел

Как кодируются в компьютерах вещественные числа?

Представление чисел с плавающей запятой

Два способа представления чисел с плавающей запятой

Вопросы и задания

Задачи


§29. Хранение в памяти вещественных чисел


Два способа представления чисел с плавающей запятой


Итак, существуют два приблизительно равноценных способа представления чисел с плавающей запятой:

• оптимальный с теоретической точки зрения, в котором целая часть нулевая, а первая цифра дробной части ненулевая (0,234 • 102);
• более удобный с практической точки зрения, в котором целая часть состоит из единственной ненулевой цифры (2,34 • 101).

К сожалению, эта «двойственность» порождает некоторую путаницу. В теоретической литературе, как правило, используется первый способ 1. Все описания конкретных компьютерных систем, напротив, базируются на втором. Причём в обоих случаях обычно используется один и тот же русский термин — мантисса. Зато в англоязычной компьютерной литературе приняты два разных термина: в первом случае значащая часть называется mantissa (слово «мантисса» для математиков однозначно связано с дробной частью числа), а во втором — significand (значащая часть).


1 К этой группе относится большинство отечественных книг по основам вычислительной техники.



Далее мы будем использовать второй вариант, поскольку именно он даёт возможность решать задачи, связанные с практическим кодированием вещественных чисел. В связи с этим мы будем применять термин «значащая часть», а не «мантисса».

В компьютере используется такое представление вещественных чисел с плавающей запятой, при котором значащая часть Z удовлетворяет условию 1 ≤ Z < В, где В — основание системы счисления. Такое представление называется нормализованным.

Нормализованное представление числа единственно — в нашем примере это 2,34 • 101. Любое число может быть легко нормализовано. Единственное, но важное исключение из правила составляет нуль — для него невозможно получить Z ≥ 1. Ради такого важного случая было введено дополнительное соглашение: число 0, в котором все биты нулевые, в качестве исключения считается нормализованным.

Всё сказанное выше можно применить и к двоичной системе:

А = ± Z • 2Р, причём 1 ≤ Z < 2.


Например: -710 = -111 • 20 = -1,11 • 210 (не забывайте, что значащая часть и порядок записаны в двоичной системе!); отсюда Z = 1,11 и Р = 10. Двоичная значащая часть всегда (исключая, разумеется, ноль!) начинается с единицы, так как 1 ≤ Z < 2. Поэтому во многих компьютерах (в том числе в компьютерах на базе процессоров Intel) эта так называемая скрытая единица не хранится в ОЗУ, что позволяет сэкономить еще один дополнительный разряд значащей части 2.


2 В результате то, что осталось после «скрытия» единичной целой части, можно вполне обоснованно называть мантиссой.



Идея «скрытой единицы» раньше действительно давала заметное увеличение точности представления чисел, поскольку количество разрядов в устройствах ЭВМ того времени было невелико и поэтому усложнение метода кодирования было оправдано. Сейчас, когда процессоры работают с 64-битными данными, это скорее дань традиции, чем практически полезная мера 3.


3 Оценим величину добавки для математического сопроцессора Intel. Значащая часть чисел двойной точности вместо «скрытой единицы» приобретает дополнительный 53-й (!) бит, что прибавляет к значению числа поправку 2-53 ≈ 1,1 • 10-16, влияющую на 16-й десятичный знак; согласно IEEE 754-2008, в 128-битовых числах эта поправка будет и того меньше: 2-113 ≈ 9,6 • 10-35.



Таким образом, при кодировании вещественного числа с плавающей запятой фактически хранятся две величины: его значащая часть (significand) и порядок. От разрядности значащей части зависит точность вычислений, а от разрядности порядка — диапазон представления чисел. В таблице 4.6 приведены характеристики стандартных вещественных типов данных, используемых в математическом сопроцессоре Intel.

Рассмотрим, как «распланированы» 4 байта, отводимые под простейший тип single. Тип double устроен совершенно аналогично, а тип extended, который является основным форматом для вычислений в математическом сопроцессоре, отличается только тем, что в нём единица в целой части не «скрывается».

В числах типа single 23 младших бита (с номерами от О до 22) хранят значащую часть числа, следующие 8 битов (с 23 по 30) — порядок, а старший (31-й) бит отведен под знак числа (рис. 4.21).

Рис. 4.21

Рис. 4.21

Правила двоичного кодирования вещественных чисел во многом отличаются от правил кодирования целых чисел. Для того чтобы в них разобраться, рассмотрим конкретный пример — закодируем число -17,25 в формате single. Прежде всего, переведём модуль числа в двоичную систему, отдельно целую и дробную части (см. § 11):

17,25 = 10001,012.


Для нормализации нужно передвинуть запятую на 410 = 1002 разряда влево:

10001,01 • 20 = 1,000101 • 2100.


Построим значащую часть, «скрыв» единицу в целой части:

М = Z - 1 = 0,0001010...0.


Так как число отрицательное, знаковый разряд нужно установить в 1, т. е. S =1.

В отличие от целых чисел значащая часть вещественных чисел хранится в прямом коде.

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

Теперь остаётся закодировать двоичный порядок 100. Порядок - это целое число со знаком, для него используется кодирование со смещением: чтобы вообще избавиться от знака порядка, к нему добавляют некоторое положительное смещение d:

Pd = P + d.


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

Для кодирования порядка в числах типа single используют смещение d — 12710 = 7F16. Таким образом, для нашего примера

Pd = 100 + 111 1111 = 1000 0011.


Собирая теперь S, Pd и М в единое 32-разрядное число, получаем:

1 10000011 00010100000000000000000


или более компактно в шестнадцатеричной системе:

Cl 8А 00 00.


Этот код и будет записан в память 4.


4 На самом деле в IBM-совместимых персональных компьютерах байты будут сохранены в памяти в обратном порядке: 00 00 8А С1.



Не все двоичные комбинации для вещественных чисел соответствуют «правильным» числам: некоторые из них кодируют бесконечные значения, а некоторые — нечисловые данные (англ. NaN — not a number, «не число»). Они отличаются от остальных чисел тем, что имеют максимально возможный порядок 5 (например, для типа single это смещённый порядок Pd = 255, а для типа для double — 2047). Подобные «неправильные» данные возникают только в результате ошибок в вычислениях.


5 Это вполне логично, поскольку для вещественных чисел переполнение (получение «бесконечного» значения) наступает именно при больших порядках.



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

Следующая страница Вопросы и задания



Cкачать материалы урока







Наверх