
- •1. Двоичная система счисления.
- •2. Восьмеричная система счисления.
- •3. Шестнадцатеричная система счисления.
- •4. Сложение и вычитание в 2, 8 и 16 c/c.
- •2. Вещественные числа (числа с плавающей запятой).
- •3. Логические данные.
- •1. Алфавит языка Си
- •2. Элементы языка
- •3. Типы данных
- •1. Формульно-словесный способ.
- •2. Блок-схемный способ.
- •Ввод - вывод одномерного массива
- •2. Вывод одномерного массива на экран.
- •Примеры обработки одномерных массивов
- •Удаление элементов из массива
- •«Школьный» алгоритм сортировки
- •Группировка массива методом прямой выборки
- •Группировка массива методом прямого обмена
- •Вставка элемента в упорядоченный массив
- •1. Ввод элементов матрицы с клавиатуры.
- •2. Вывод матрицы на экран.
2. Вещественные числа (числа с плавающей запятой).
ПК имеет несколько типов вещественных чисел, различающихся количеством разрядов, отведенных для мантиссы и порядка числа. Мы будем рассматривать тип float для 32-х разрядных процессоров..
Тип float по стандарту IEEE 754 - это двоичное число, занимающее 4 байта памяти. Нумерация двоичных разрядов 31, 30, ... , 1, 0.
Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале [0; 1). Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно. Например, 0,0001 можно записать в 4 формах:
0,0001 = 0,0001×100 , где 0,0001 - мантисса, а порядок равен 0 (степень основания системы счисления 10)
0,0001 = 0,001×10−1
0,0001 = 0,01×10−2
0,0001 = 0,1×10−3
Поэтому
в указанном стандарте применяется
другая форма записи — нормализованная,
в которой мантисса десятичного числа
принимает значения от 1 (включительно)
до 10 (не включительно), а мантисса
двоичного числа принимает значения от
1 (включительно) до 2 (не включительно).
То есть в мантиссе слева от запятой до
применения порядка находится ровно
один знак. В такой форме любое число
(кроме 0) записывается единственным
образом. Ноль же представить таким
образом невозможно, поэтому стандарт
предусматривает специальную
последовательность битов для задания
числа 0 (а заодно и некоторых других полезных
чисел, таких как и
).
Так как старший двоичный разряд (целая часть) мантиссы вещественного числа в нормализованном виде всегда равен «1», то его можно не записывать, сэкономив таким образом один бит, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем 2 (в троичной, четверичной, десятичной и др.), этого замечательного свойства нет (ведь целая часть там может быть не только единицей).
В указанном формате float старший 31-й разряд используется для хранения знака числа «0»-знак «+», «1» - знак «-». Один байт (разряды 23-30) используются для хранения порядка. Порядок записан со сдвигом - 127. То есть, чтобы получить актуальное значение порядка нужно вычесть из него сдвиг. Если записан порядок 243, то в самом деле порядок числа составляет:
P = 243 – 127 = 116.
Младшие 23 бита числа (разряды 0 – 22) используются для записи дробной части мантиссы. Целая часть, которая всегда равна «1» в памяти не хранится. Она добавляется при обработке данного числа.
Знак |
Порядок (8 бит) |
Мантиса (23+1 бита) | ||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
1, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
31 |
30 |
23 |
22 |
0 |
Максимальное значение числа формата float:
Максимальному
смещенному порядку 111111102
= 25410
соответствует реальный порядок числа
рmax
= 254 – 127 = 127 (порядок 111111112
зарезервирован для представления
и
).
Максимальное значение мантиссы
1,1111 1111 1111 1111 1111 1112 = 10,0000 0000 0000 0000 0000 0002
- 0,0000 0000 0000 0000 0000 0012,
что соответствует в 10 с.с. 2 – 1×2-23 ≈ 1.99999988.
Таким образом, максимальное число в формате float получается равным:
1.99999988 × 2127 ≈ 3.402823 × 1038
Бесконечности
В
число с плавающей запятой можно записать
значение или
.
Бесконечности позволяют получить хотя
бы близкий к правильному результат
вычисления в случае переполнения.Согласно
стандарту IEEE 754 число с плавающей запятой
считается равным бесконечности, если
все двоичные разряды его порядка -
единицы, а мантисса равна нулю. Знак
бесконечности определяется знаковым
битом числа.
Получить бесконечность можно при переполнении и при делении ненулевого числа на ноль. При этом
NaN - это аббревиатура от фразы "not a number". NaN является результатом арифметических операций, если во время их выполнения произошла ошибка. В IEEE 754 NaN представлен как число, в котором все двоичные разряды порядка - единицы, а мантисса не нулевая.
Минимальное значение числа формата float:
Минимальному смещенному поряду 000000012 = 110 соответствует реальный порядок числа рmin = 1 – 127 = -126 (порядок 000000002 зарезервирован для представления денормализованных чисел).
Минимальное значение мантиссы 1,0000 0000 0000 0000 0000 0002, что соответствует 1 в 10 с.с.
Таким образом, минимальное нормализованное число в формате float получается равным:
1×2-126 ≈ 1.175494 × 10-38
Денормализованные числа (denormalized/subnormal numbers - DeN) - это способ увеличить количество представимых числом с плавающей запятой значений около нуля, для повышения точности вычислений. Каждое значение денормализованного числа меньше самого маленького нормализованного ("обычного") значения числа с плавающей запятой. Согласно стандарту:
1.Если
порядок равен своему минимальному
значению (000000002
= -12710
) и все биты мантиссы равны нулю, то
это .
Знак нуля определяется значением
знакового разряда.
2.Если же порядок равен (000000002), а мантисса не равна нулю, то это число с порядком, на единицу большим минимального (-126) и данной мантиссой, целая часть которой считается равной нулю, а не единице. Таким образом минимальное положительное денормализованное число в формате float:
0 0000 0000 0000 0000 0000 0000 0000 0012 = 1 × 2-23 × 2-126 ≈ 1.401298 × 10-45
Хоть денормализованные числа и позволяют бороться с погрешностями и обрабатывать очень маленькие значения, за эти возможности приходится дорого платить. Ввиду сложности обработка денормализованных чисел крайне редко реализуется на аппаратном уровне - вместо этого используются программные реализации, работающие значительно медленнее. В современных процессорах обработка денормализованных чисел происходит в десятки раз медленнее, чем обработка нормализованных чисел.
Алгоритм получения представления вещественного числа в памяти ПК
Перевести модуль данного числа в двоичную систему счисления;
Нормализовать двоичное число, т.е. записать в виде M × 2p, где M — мантисса (ее целая часть равна 1(2)) и p — порядок, записанный в десятичной системе счисления;
Прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
Учитывая знак заданного числа (0 — положительное; 1 — отрицательное), выписать его представление в памяти ЭВМ.
Пример. Записать код числа -312,3125 в формате float.
Двоичная запись модуля этого числа имеет вид 312,312510 = 100111000,01012.
Запятую перенести на 8 позиций влево и получить нормализованную запись числа
100111000,0101 = 1,001110000101 × 28.
При сдвиге запятой влево порядок будет положительным, а при сдвиге вправо – отрицательным.
Рассчитывается смещенный порядок + 8 + 127 = 135. Далее определяется двоичный код смещенного порядка 13510 = 100001112.
Окончательно записывается двоичный код числа, мантисса справа дополняется незначащими нулями
Знак | Порядок | Мантиса
1 10000111 00111000010100000000000
Очевидно, что более компактно полученный код стоит записать в шестнадцатеричной системе счислений следующим образом:
1100 0011 1001 1100 0010 1000 0000 0000 2 = C39С280016.