Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Infa / 1лек.ppt
Скачиваний:
73
Добавлен:
27.04.2015
Размер:
5.1 Mб
Скачать

Сложение-вычитание

Если показатели степени равны, сложение-вычитание реализуются элементарно. Пусть:

X1 = M1qp X2 = M2qp

Тогда:

X1 + X2 = M1qp + M2qp = (M1 + M2) * qp X1 - X2 = = M1qp - M2qp = (M1 - M2) * qp

Если показатели степени отличаются, нужно воспользоваться неоднозначностью представления, и выровнять значения показателей степени.

X1 = M1qp1 X2 = M2qp2 X1 + X2 = M1qp1 + M2qp2 = (M1 + M2*qp2-p1) * qp1

После чего нужно привести M2*qp2-p1 к нормальному (т.е. к обычному, без показателя степени) виду, сложить с M1 результат и будет мантиссой суммы, а показателем степени суммы будет p1.

1,2*105 + 2*10-2 = (1,2 + 2*10-2-5) * 105 = (1,2 + 2*10-7) * 105 = (1,2 + + 0,0000002) * 105 = 1,2000002 * 105

Число с плавающей запятой называется нормализованным, если выполняется условие:

1 <= |M| < q

Если q основание системы счисления, в которой записано M, условие сводится к тому, что в мантиссе запятая стоит после первого значащего разряда.

Любое число кроме нуля можно записать в такой форме.

34,56 * 103 = 3,456 * 104 0,076 * 10-5 = 7,600 * 10-7 567,1 * 109 = 5,671 * 1011 0,0089 * 10-8 = 8,900 * 10-11

Числа с плавающей запятой предполагают разделение труда – за диапазон отвечает показатель степени, за точность – мантисса. В результате при любом диапазоне можно использовать всю мантиссу – все n знаков.

3,844 * 108 (расстояние до Луны в метрах)

1,2 * 10-2 (средний размер рыжего таракана, в метрах)

могут быть с успехом записаны в одном и том же формате, отводящем 4 разряда под мантиссу и 1 под показатель степени – их точность не превышает 4 знака, а значение по модулю не слишком велико.

Все люди делятся на 10 типов: те, кто понимают двоичную систему счисления и те, кто нет.

Двоичные дроби

Переводить целые числа из двоичной системы в десятичную и обратно умеют почти все. С дробями, в общем, не сильно сложнее. Для начала нужно осознать, чему равна дробь, записанная в позиционной системе счисления.

На примере десятичных:

0,357 = 3/10 + 5/100 + 7/1000 = 3*10-1 + 5*10-2 + 7*10-3

Обобщаем до системы счисления с основанием q: 0,a1a2…an = a1q-1+ a2q-2 + .. + anq-n

Распространяем на двоичный случай:

0,1100101 = 1*2-1 + 1*2-2 + 0*2-3 + 0*2-4 + 1*2-5 + 0*2-6 + 1*2-7 = = 1/2 + 1/4 + 1/32 + 1/128 = 0,5 + 0,25 + 0,03125 + 0,0078125 = =0,7890625

Именно так двоичные дроби переводятся в десятичные.

Рассмотрим обратную ситуацию. Пусть F – число от 0 до 1 (включая ноль, исключая 1). На выходе нужно получить дробь, записанную в позиционной системе счисления по основанию q.

0,x1x2x3…xm… = F

Справа – исходная дробь, слева – результат преобразования в виде потенциально бесконечной строки неизвестных.

При умножении обеих частей на q, получим:

x1,x2x3…xm… = F*q

Поскольку числа равны, соответственно равны и их целые и дробные части:

x1 = [F*q] 0,x2x3…xm… = {F * q}

В результате мы получили значение x1, а вычисление оставшейся части дроби свели к исходной задаче.

Пример: представим 1/3 в виде 5-и разрядной двоичной дроби.

исходная задача: 0,x1x2x3x4x5 = 1/3

умножаем на 2: x1,x2x3x4x5 = 2/3 => x1 = 0; 0,x2x3x4x5 = 2/3

умножаем на 2: x2,x3x4x5 = 4/3 => x2 = 1; 0,x3x4x5 = 1/3

умножаем на 2: x3,x4x5 = 2/3 => x3 = 0; 0,x4x5 = 2/3 умножаем на 2: x4,x5 = 4/3 => x4 = 1; 0,x5 = 1/3 умножаем на 2: x5 = 2/3 => x5 = ?

По правилу, x5 должен быть равен 0. Но, т.к. это последний из

рассматриваемых битов (из соображений разрядности или

точности – не важно), здесь разумно применить округление.

В результате x5 = 1. Общий результат – 0,01011

Второй пример – десятичное 0,1 в двоичную дробь.

исходная задача: 0,xxx = 0,1

умножаем на 2: x1,xxx = 0,2 => x1 = 0; 0,xxx = 0,2

умножаем на 2: x2,xxx = 0,4 => x2 = 0; 0,xxx = 0,4

умножаем на 2: x3,xxx = 0,8 => x3 = 0; 0,xxx = 0,8

умножаем на 2: x4,xxx = 1,6 => x4 = 1; 0,xxx = 0,6 умножаем на 2: x5,xxx = 1,2 => x5 = 1; 0,xxx = 0,2

... (дальше по кругу пойдут 0, 0, 1, 1, 0, 0, 1, 1, 0 и т.п. )

В результате 0,1d = 0,0(0011)b

В памяти компьютера двоичное число с плавающей запятой представлено набором битов. Существует много стандартов на форматы представления, но почти все они построены по одному шаблону:

Знак – плюс (0) или минус (1) – 1 бит Показатель степени – целое число – сколько-то бит Мантисса – дробь – оставшиеся биты Общая схема изображена на рисунке

Знак числа вынесен в отдельное поле, а мантисса считается всегда положительной.

Условием нормализации является 1 <= M < q.

Для двоичной системы это означает 1 <= M < 2.

То есть, если число нормализовано, целая часть M всегда будет равна 1 (ноль не подходит, а других вариантов нет).

Значит, можно сэкономить на этом бите – не хранить, а только подразумевать его наличие.

Этот приём используется в нескольких распространённых стандартах.

Кодирование вещественных чисел

Любое действительное число можно записать в стандартном виде M × 10p, где 1<M<10, p — целое.

Например, 120100000 = 1,201 × 108. Поскольку каждая позиция десятичного числа отличается от соседней на степень числа 10, умножение на 10 эквивалентно сдвигу десятичной запятой на одну позицию вправо.

Аналогично деление на 10 сдвигает десятичную запятую на позицию влево. Поэтому приведенный выше пример можно продолжить: 120100000 = 1,201 × 108 = 0,1201 × 109 = 12,01 × 107.

Десятичная запятая "плавает" в числе и больше не помечает абсолютное место между целой и дробной частями.

Соседние файлы в папке Infa