Смекни!
smekni.com

Теоретические основы информатики 3 (стр. 9 из 11)

Мантисса

Знаковый разряд Порядок

Рис. 1.13. Порядок представления дробных чисел

Затем извлечем порядок (010) и переведем его как 3-битовое представление с избытком в десятичную систему счисления. В нашем случае код порядка явля­ется представлением 2. Переместим разделительную точку на 2 бита вправо (отрицательный порядок означает, что точку нужно перемещать влево). Следовательно, мы имеем последовательность

10.11,

которая является двоичной записью дроби 23/4. Затем обращаем внимание на то, что знаковый разряд равен 0, следовательно, перед нами положительное число. Делаем вывод, что в байте 00101011 хранится число 23/4.

Рассмотрим еще один пример. Байт имеет последовательность: 10101010.

Выписываем ман­тиссу

.1010

и перемещаем точку на один бит влево, так как порядок (010) в 3-битовом представлении с избытком является кодом числа -2. Имеем последовательность 0101010, которая является кодом 5/32. Знаковый разряд исходной последовательности ра­вен 1, значит, это число отрицательное. Делаем вывод, что последовательность 10101010 является кодом -5/32.

Чтобы записать число в представлении с плавающей запятой, выполним действия, обратные предыдущим. Например, чтобы записать число 11/8, сначала вы­ражаем его в двоичном представлении и получаем 1.001. Затем переписываем эту последовательность в область мантиссы слева направо, начиная с самой левой единицы в двоичной записи. На этом этапе байт выглядит следующим образом:
1001.

Теперь нужно заполнить поле порядка. Для этого представляем мантиссу с раз­делительной точкой слева и определяем число битов и направление, в котором нужно передвинуть точку, чтобы получить исходную двоичную запись. В нашем примере, чтобы получить 01011001, нужно передвинуть точку в .1001 на один бит вправо. Следовательно, порядок равен 1, поэтому записываем 101 (код 1 в представлении с избытком 4) в поле порядка. Наконец, записываем в позицию знако­вого разряда 0, потому что дробь положительная. Окончательный байт выглядит так: 01011001.

Наиболее важным в преобразовании является заполнение поля ман­тиссы. Правило гласит: выписывать последовательность разрядов двоичной за­писи слева направо, начиная с самой левой 1 в двоичной записи. В качестве примера рассмотрим процесс записи числа 3/8, двоичное представление которого .011. В этом случае мантиссой будет 1100 а не 0110.

Мантисса имеет такой вид, потому что поле мантиссы заполняется, начиная с са­мой левой единицы, которая появляется в двоичном представлении. Это правило исключает возможность многократной записи одного значения. Оно также означает, что мантисса чисел, не равных нулю, будет всегда начинаться с 1. О таком представлении говорят, что оно нормализованное (normalized form). Обратите внимание, что представление нуля является особым случаем: его представление с плавающей точкой состоит из одних нулей.

1.1.9.2. Ошибка усечения

Попытаемся записать значение 25/8 в представлении с плавающей точкой, используя для него один байт памяти. Сначала записываем 25/8 в двоичном представлении, получаем код 10.101.

Но, когда мы переписываем его в поле мантиссы, нам не хватает места, и самая правая 1 (которая занимает позицию с весом разряда ]/8) теряется.

25/8 Исходная запись

10.101 Двоичная запись

10 101 Последовательность битов

_ _ _ _ 1010 Потерянный бит

Знаковый Мантисса

Порядок Рис. 1.14. Ошибка усечения

Если мы на данном этапе будем игнорировать эту проблему и продолжим заполнение поля порядка, то в результате придем к последовательности 01101010, которая является представлением 21/2вместо 25/8. То, что произошло, называется ошибкой усече­ния (truncation error), или ошибкой округления (round-off error), и означает, что часть числа потеряна, потому что поле мантиссы недостаточно велико.

Если использовать более длин­ное поле для мантиссы, то количество таких ошибок можно уменьшить.

Например, для хранения чисел в форме представления с плавающей точкой используется, по меньшей мере, 32 бита вместо 8 битов, которые мы использовали здесь. Такой подход по­зволяет также увеличить поле для порядка числа. Но даже в этом формате пред­ставления иногда возникает необходимость более точных расчетов.

Другой причиной ошибки усечения может быть явление, с которым мы уже сталкивались в десятичной системе счисления: проблема бесконечных дробей, таких, например, которые появляются, когда мы пытаемся представить 1/3 в виде десятичной дроби. Некоторые числа просто нельзя точно записать в виде десятичной дроби, независимо от количества цифр, которое мы используем.

Десятичная и двоичная системы счисления различаются тем, что в двоичной системе существует больше чисел с бесконечным представлением, чем в десятичной. Например, дробь 1/10 является бесконечной в двоичном представлении. Представьте, какие проблемы это повлечет за собой, если неосмотрительный пользо­ватель будет использовать представление с плавающей точкой для того, чтобы хранить и производить операции с деньгами. В особенности, если в качестве еди­ницы измерения он будет использовать рубль, то значение в десять копеек будет записано неточно. В этом случае лучше выбрать единицей хранения данных 1 копейку так, чтобы все значения были целыми и могли быть с достаточной точностью представлены в памяти компьютера при помощи двоичного дополнительного кода.

Ошибка усечения и связанные с нею проблемы представляют большую важность для людей, работающих в области численного анализа. Этот раздел математики занимается проблемами, которые возникают при действительных расче­тах, часто очень объемных и требующих высокой точности.

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

21/2 + 1/8 + 1/8.

Если мы будем складывать числа в указанном порядке, то сначала прибавим 1/8 к 21/2, получим дробь 25/8, двоичная запись которой — 10.101. К сожалению, когда мы сохраняем это число, возникает ошибка усечения, в результате которой полученная нами сумма будет сохранена как 21/2 (что равно одному из слагае­мых). На следующем шаге мы прибавляем к этой сумме 1/8. Здесь опять возника­ет ошибка усечения, в результате которой мы получаем неправильный ответ 21/2.

Теперь сложим эти числа в другом порядке. Сначала найдем сумму 1/8 и 1/8, которая равна 1/4. В двоичном представлении 1/4 равна .01. Результат первого шага будет храниться в байте 00111000, что верно. Теперь находим сумму 1/4 и следующего числа 21/2, получаем значение 23/4, которое хранится в байте 01101011. На этот раз мы получили правильный ответ.

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

Разработчики современного коммерческого программного обеспечения защищают неграмотного пользователя от таких проблем, как эта. В обычных програм­мах табличных вычислений пользователь получит правильный ответ, если толь­ко слагаемые не различаются в 106 раз. Следовательно, если вам нужно прибавить единицу к 10 000 000 000 000 000, вы получите 10 000 000 000 000 000, а не 10 000 000 000 000 001.

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

1.1.9.3. Преобразование чисел из одной системы счисления в другую

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

1. Преобразование из десятичной системы счисления в двоичную (преобразование из 10 в 2).

Число последовательно делится на основание новой системы 2 до тех пор, пока делитель не станет меньше делимого, после чего полученные нули и единицы (т.е. все остатки) выписываются в обратном порядке. Напомним, что при переводе чисел из десятичной системы в двоичную систему остатками могут быть только нули и единицы.