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

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

Пример 15. Рассмотрим, как будет выглядеть запись мантиссы (m) числа а = 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.  Потеря значащих цифр мантиссы у меньшего из чисел при выравнивании порядков

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

2.  Потеря крайней справа значащей цифры результата при сложении или вычитании

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

Пример 16. При сложении пятнадцати разрядных мантисс

0,1111100000111112 + 0,1001001001001002  = 1,1000101010000112

количество значащих цифр стало равным 16, и после округления и нормализации результат будет выглядеть так: 0,110001010100010 х 21.                                          О

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

Пример   17.   Пусть   требуется  вычислить  разность  чисел 0,(0011)2 и 0,0011001100112.

Произведем вначале вычитание «на бумаге». Представим первую дробь (она периодическая) в виде 0,001100110011(0011)2. Перед периодом выписали 12 цифр, так как вторая дробь содержит 12 значащих цифр. Произведем вычитание и получим: 0,000000000000(0011)2 = 0,(1100)2 х 2-14.

Переведем периодическую дробь в десятичную систему счисления, для этого воспользуемся формулой суммы бесконечно убывающей геометрической прогрессии с q = 1/2 и b=11002/24

Получим:   0,(0011)2   -   0,0011001100112  = 0,(1100)2 х 2-14  = 0,8 х 2 -14.

При выполнении этой же операции вычитания в компьютере при условии, что под мантиссу отведено 12 разрядов, получим: 0,1100110011012 х 2-2 - 0,11001100112 х 2 = 0,12  х 2 13 = 1 х 2 14 т. е. уже старшая значащая цифра результата оказалась неверной.

3. Выход за границу допустимого диапазона значений при нормализации результата

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

Пример 18. Выполним сложение

0,12 х 2127 + 0,12 х 2127 = 0,12 х 2128, и если максимальный представимый порядок равен 127, результат оказывается не представимым. 

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

4. Получение «не представимого»

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

5. Потеря младших значащих цифр результата

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

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

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

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

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

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

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

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

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

Последнее изменение: Thursday, 17 January 2019, 14:03