logo search
Лекция_Представление_информации_в_компьютере1

Особенности реализации вещественной компьютерной арифметики.

Когда говорят о точности представления вещественных чисел в компьютере, надо помнить следующее: десятичное число, имеющее даже всего одну значащую цифру после запятой, вообще говоря, невозможно представить точно в формате с плавающей запятой. Объясняется это тем, что конечные десятичные дроби часто оказываются бесконечными периодическими двоичными дробями. Так 0,110 = 0,0(0011)2, а значит, и в нормализованном виде такое двоичное число будет иметь бесконечную мантиссу и не может быть представлено точно. При записи подобной мантиссы в ячейку компьютера число не усекается, а округляется. Если под мантиссу отведено п разрядов и (n+1)-я значащая цифра двоичной нормализованной мантиссы равна 0, то цифры, начиная с (n+1)-й, просто отбрасываются, если же (n+1)-я цифра равна единице, то к целому числу, составленному из первых п значащих цифр мантиссы, прибавляется единица.

Пример. Рассмотрим, как будет выглядеть запись мантиссы (т) числа а = 0,110 при двоичной нормализации для различного количества бит (n), отведенных под мантиссу. а = 0,110 = 0,0(0011)2 = 0,11(0011)2 × 2-3, т. е. мантисса в нормализованном числе есть 0,11(0011)2. При n = 10 m = 1100110011 (остальные цифры мантиссы отброшены в результате округления). При n = 12 m = 110011001101 (последняя цифра изменилась с 0 на 1 при округлении). При n = 13 m = 1100110011010 (две последние цифры изменились при прибавлении 1).

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

1). Потеря значащих цифр мантиссы у меньшего из чисел при выравнивании порядков. При сложении и вычитании вещественных чисел в худшем случае утерянными оказываются все значащие цифры меньшего числа, и a±b=a, что является абсурдным с точки зрения математики, но возможным в компьютерной арифметике с ограниченным числом разрядов (см. пример 12).

2). Потеря крайней справа значащей цифры результата при сложении или вычитании. При сложении и вычитании двух чисел количество значащих цифр может увеличиться лишь на одну, это влияет на точность, но не на правильность результата. Так, при сложении пятнадцатиразрядных мантисс 0,1111100000111112 + 0,1001001001001002 = = 1,1000101010000112, количество значащих цифр стало равным 16, и после округления и нормализации результат будет выглядеть так: 0,110001010100010 × 21.

Гораздо хуже обстоит дело при вычитании близких по модулю и имеющих одинаковый знак чисел (или сложении чисел разного знака). В этом случае достоверной может остаться всего одна значащая цифра, а остальные цифры нормализованной мантиссы (скорее всего нули) окажутся недостоверными. Пусть требуется вычислить разность чисел 0,(0011)2 и 0,0011001100112. Произведем вначале вычитание «на бумаге». Представим первую дробь (она периодическая) в виде 0,001100110011(0011)2. Перед периодом выписали 12 цифр, так как вторая дробь содержит 12 значащих цифр. Произведем вычитание и получим: 0,000000000000(0011)2 = 0,(1100)2 × 2-14. Переведем периодическую дробь в десятичную систему счисления и получим 0,8 × 2-14. При выполнении этой же операции вычитания в компьютере при условии, что под мантиссу отведено 12 разрядов, получим: 0,1100110011012 × 2-2 - 0,11001100112 × 2-2 = 0,12 × 2-13 = 1 × 2-14, т. е. уже старшая значащая цифра результата оказалась неверной

3). Выход за границу допустимого диапазона значений при нормализации результата. Данная ситуация возникает в случае, когда порядок результата оказывается либо больше максимально возможного значения, либо меньше минимально возможного. Такую ситуацию различные компиляторы и операционные системы обрабатывают по-разному, но чаще всего выполнение программы прерывается с сообщением об ошибке «арифметическое переполнение». Выполним сложение 0,12 × 2127 + 0,12 × 2127 = 0,12 × 2128, и если максимальный представимый порядок равен 127, результат оказывается не представимым.

4). Получение «не представимого». Данная ситуация соответствует описанному выше «арифметическому переполнению»; однако в 80-разрядном представлении вещественных чисел (а именно он является основным в современных персональных компьютерах) диапазон допустимых порядков достаточно велик, чтобы производить практические любые вычислительные работы, и возникновение подобной ошибки скорее всего означает, что программа составлена неверно.

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

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

Подведем итог всему сказанному о компьютерной вещественной арифметике:

а) уже на стадии записи чисел в компьютер возникают ошибки округления, которые при выполнении арифметических действий нарастают;

б) наличие погрешностей округления приводит к следующему правилу программирования: неразумно сравнивать в программе два вещественных числа на точное равенство (вместо сравнения на равенство правильнее требовать, чтобы модуль разности сравниваемых чисел не превосходил некоторого числа ɛ, соответствующего абсолютной погрешности представления);

в) в результате вычитания возникают недостоверные значащие цифры, которые могут привести к серьезной потере точности или получению неправильного результата;

г) прибавление или вычитание малого числа может никак не сказаться на результате;

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

Вопросы.

1. Запишите следующие десятичные числа в нормализованном виде:

а) 217,934; в) 10,0101; б) 75321; г) 0,00200450.

2. Приведите к нормализованному виду следующие числа, используя в качестве Р основания их систем счисления:

а) —0,0000010111012;

б) 98765432Ю10;

в) 123456789,ABCD16.

3. Сравните следующие числа:

а) 318,4785 × 109 и 3,184785 × 1011;

б) 218,4785 × 10-3 и 21847,85 × 10-4;

в) 0,11012 × 22 и 1012 × 2-2.

4. Сравните диапазон представления чисел с плавающей за­пятой в 32-разрядном формате (24 разряда для мантиссы и 6 разрядов для модуля порядка) с диапазоном представления чисел с фиксированной запятой в том же формате.

5. Каковы преимущества компьютерного представления чисел с плавающей запятой по сравнению с их представлением с фиксированной запятой, которое мы чаще всего используем в повседневной жизни?

6. Произведите следующие арифметические действия над десятичными нормализованными числами согласно праилам вещественной компьютерной арифметики (в мантиссе должно быть сохранено 6 значащих цифр):

а) 0,397621 х 103 + 0,237900 х 101;

б) 0,982563 х 102 - 0,745623 х 102;

в) 0,235001 х 102 • 0,850000 х 103;

г) 0,117800 х Ю2 : 0,235600 х 103.

При выполнении этого задания следует нормализовать мантиссу результата соответствующего арифметического действия, а затем округлить ее

7. Выполните действие над машинными кодами чисел с плавающей запятой в 32-разрядном формате: X =А + В, где А = 125,75 и В = -50.

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