Информатика. Курс лекций. Громов Ю.Ю - 17 стр.

UptoLike

Ошибка усечения. При операциях с числами, записанными в двоичной нотации с плавающей точкой, могут возникать
ошибки, аналогичные ошибкам переполнения.
Пример. Представить число 2
5
/
8
в виде однобайтового кода в двоичной нотации с плавающей точкой.
Прежде всего, определим двоичное представление числа 2
5
/
8
, которое имеет вид 10.101. Однако при копировании этого
значения в поле мантиссы имеющихся четырех разрядов оказывается недостаточно и самая правая единица в двоичном
представлении, имеющая весовое значение
1
/
8
, теряется (рис. 1.16). Если не обратить на это внимание и продолжить запол-
нение поля порядка числа и знакового бита, будет получена комбинация 01101010, которая на самом деле представляет чис-
ло 2
1
/
2
, а не 2
5
/
8
.
Это явление называется ошибкой усечения (truncation error), или ошибкой округления (round-off error). Оно означает, что
некоторая часть кодируемого числа теряется, поскольку размер поля мантиссы оказывается недостаточным.
Во избежание подобных ошибок можно использовать поле мантиссы большего размера. Как и в случае целых чисел,
для представления значений в нотации с плавающей точкой принято использовать комбинации не менее 32 бит, а не 8 бит,
как в приведенных выше примерах. Одновременно это позволяет расширить и размер поля порядка числа. Но даже при ис-
пользовании более длинных полей достигаемая точность представления числовых значений в некоторых случаях оказывает-
ся недостаточной.
1.16. Схема кодирования числа 2
5
/
8
Существует еще одна причина появления ошибок усечения, с которой каждый из нас уже встречался при изучении десятичной
системы счисления. Это проблема бесконечного количества дробных знаков в представлении числа, которая встречается, напри-
мер, при выражении числа
1
/
3
в виде десятичной дроби. Дело в том, что некоторые числа невозможно точно выразить, сколько бы цифр
мы не использовали для их представления.
Это проблема бесконечного количества дробных знаков в представлении числа, которая встречается, например, при вы-
ражении числа
1
/
3
в виде десятичной дроби. Дело в том, что некоторые числа невозможно точно выразить, сколько бы цифр
мы не использовали для их представления.
Различие между традиционной десятичной системой счисления и двоичной системой состоит в том, что в двоичной
системе больше чисел имеют бесконечное представление, чем в десятичной. Например, даже такое число, как одна десятая,
имеет в двоичной системе бесконечное представление. Попробуйте представить себе, какие могут возникнуть проблемы,
если какой-либо неосторожный человек решит использовать двоичные числа с плавающей точкой для хранения и обработки
данных, представляющих собой суммы в долларах и центах. Например, если единицей измерения данных является доллар,
то оказывается невозможным точно представить даже обычную десятицентовую монету. Хорошее решение в подобном слу-
чаеизмерять данные в единицах центов, тогда все значения окажутся целыми числами, и их можно будет представить с по-
мощью двоичного дополнительного кода.
Ошибки усечения могут возникнуть и при сложении очень больших и маленьких чисел. В типичном приложении элек-
тронных таблиц корректные результаты могут быть достигнуты, если различия между суммируемыми значениями не пре-
восходят 10
16
или меньше. Поэтому если потребуется добавить единицу к числу
10 000 000 000 000 000,
то велика вероятность, что будет получен ответ
10 000 000 000 000 000
вместо предполагаемого значения
10 000 000 000 000 001.
Пример. Сложить следующие три числа, представленные в однобайтовых кодах двоичной нотации с плавающей точ-
кой 2
1
/
2
+
1
/
8
+
1
/
8
.
Если суммировать эти числа в указанном порядке, то сначала будет получено промежуточное значение 2
5
/
8
(в результа-
те сложения чисел 2
1
/
2
и
1
/
8
), двоичным представлением которого является битовая комбинация 10.101. Это число не может
быть представлено точно (см. предыдущий пример), поэтому в результате сложения будет получено число 2
1
/
2
(т.е. первое из
слагаемых). Если теперь прибавить к полученному результату следующее число
1
/
8
, то опять возникнет та же ошибка усече-
ния и вновь будет получен тот же неверный ответ – 2
1
/
2
.
А теперь попробуем сложить те же числа, но в обратном порядке. Сначала сложим числа
1
/
8
и
1
/
8
, в результате чего по-
лучим число
1
/
4
, двоичным представлением которого является битовая комбинация 0.01; соответствующий байт результата
будет иметь вид 00111000, отражающий точное значение. Теперь прибавим число
1
/
4
к следующему числу в списке, 2
1
/
2
. В
результате будет получено правильное значение 2
3
/
4
, которое может быть точно представлено в байте в виде кода 01101011.
На этот раз ответ правильный.
Поэтому общее правило суммирования большого количества чисел требует начинать операцию сложения с самых ма-
лых чисел, предполагая, что в результате будет получено достаточно большое промежуточное значение, которое затем мож-
но безопасно сложить с оставшимися большими числами.
Десятичное представление
Исходное двоичное представление
Исходная битовая комбинация
Потерянный бит
Знаковый бит
Порядок
Мантисса
1 0 1 0 1
1 0 1 0
10.101
2
5
/
8