ПРЕДСТАВЛЕНИЕ ВЕЩЕСТВЕННЫХ И ЦЕЛЫХ ЧИСЕЛ В ЭВМ. ЧИСЛА С ПЛАВАЮЩЕЙ ЗАПЯТОЙ

Пусть на изображение каждого вещественного числа отводится одно и то же число т базисных элементов. Ясно, что на т элементах можно изобразить не более т разрядов любого числа. Чтобы это изображение можно было снова прочитать, необходимо установить взаимно однозначное соответствие между базисными элементами, отведенными для изображения каждого числа, и положением разрядов в числе относительно запятой. Существует два основных общепринятых стандартных способа представления вещественных чисел в ЭВМ, различие между которыми заключается в том, является ли указанное соответствие одним и тем же для всех изображаемых чисел либо зависит от самого конкретного числа. Таким образом, в целях реализации компьютерных вычислений используются следующие способы представления вещественных чисел:

• в форме чисел с фиксированной запятой (точкой) (fixed-point

numbers);

• в форме чисел с плавающей запятой (точкой) (floating-point

numbers).

Предположим, что каждые т базисных элементов служат для изображения т последовательных разрядов чисел, причем положение этих разрядов относительно запятой фиксировано и является одним и тем же для всех дробей. Будем считать, что на изображение разрядов, стоящих слева от запятой, отводится г элементов, где г > 0. Описанный способ представления вещественных чисел в ЭВМ называется представлением в форме чисел с фиксированной запятой. С помощью таких дробей можно точно запомнить любую из конечных /ьичных дробей, имеющих не более г ненулевых разрядов слева от запятой и не более р - г ненулевых разрядов справа от запятой. Все представимые числа х лежат в диапазоне г < х < рг.

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

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

где р есть целое число — основание системы счисления, при этом

1/Р<М<1.

Число а называют мантиссой числа х, число b — его порядком, рь экспонентой. Пусть на изображение порядка без знака отводится г базисных элементов, а на изображение мантиссы — т - г элементов. Если порядок и мантисса теперь представлены в виде дробей с фиксированной запятой, то это как раз и будет представлением вещественного числах в формате числа с плавающей запятой. Заметим, что порядок всегда представляется точно, так как он является целым числом. Мантисса же будет представлена точно лишь для тех /ьичных дробей, которые имеют не более т - г ненулевых старших разрядов. Описанным способом можно представить только вещественные числах из примерного диапазона значений

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

Рассмотрим для примера операцию вычитания двух вещественных чисел 0,1234567891234536 — 0,1234567891234535. Используя в программе на языке С формат чисел с плавающей запятой двойной точности (double-precision), получим в результате вычислений значение 1,110223024625157 • 1016; точный результат этой операции равен 1,0 • 1016. Относительная погрешность компьютерных вычислений в данном примере составляет более 11 %(!). Если же полученное число будет участвовать в каких-либо дальнейших вычислениях, можно ожидать, что погрешность конечных результатов существенно превысит 11%!

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

Сравним теперь пространство, определенное целыми числами, с пространством, определенным числами с плавающей запятой. Будем рассматривать машинное представление в формате одинарной точности (single-precision), когда и целые числа, и числа с плавающей запятой хранятся в 32-битных машинных словах (т = 32). Очевидно, что при использовании такого формата существует 232 возможных комбинаций битов. Для упрощения изложения далее будем рассматривать только значения чисел со знаком. Применительно к целым числам это означает, что они могут принимать значения в диапазоне от 0 до 231 (так как старший бит в 32-битном машинном слове зарезервирован для хранения знака числа). Однако числа с плавающей запятой при использовании для их представления 32-битных машинных слов могут принимать значения в гораздо более широком диапазоне: от 0 до 2128. Между каждыми двумя последующими степенями числа 2 находится одинаковое количество чисел с плавающей запятой, а именно 223 (количество возможных комбинаций 23 бита мантиссы). То есть в диапазоне от 1 (2°) до 2 (21) существует 223 = = 8388608 возможных чисел с плавающей запятой; в диапазоне от 2 (2*) до 4 (22) существует такое же количество чисел; точно такое же их количество находится в диапазоне между 32768 (215) и 65536 (216) или между 0,03125 (2-5) и 0,0625 (2“4) и т.д.

Все изложенное выше можно интерпретировать более наглядным образом: при представлении линейных координат с помощью чисел с плавающей запятой существует большее количество возможных точек между началом координат и точкой, отстоящей от него на 1 мм, чем между началом координат и некоторым далеким от него пунктом (например, расположенным на другом краю планеты). Это означает, что точность представления позиции некоторого объекта с помощью чисел с плавающей запятой зависит от того, где именно находится данный объект и какие единицы при этом используются. Например, если число с плавающей запятой, имеющее значение 1,0, соответствует расстоянию 1 мм, то в том случае, когда объект находится вблизи начала координат (т.е. когда его местоположение в трехмерном пространстве близко к точке с координатами [0, 0, 0J), позиция данного объекта может быть представлена с точностью около 0,0000001 мм (и это очень высокая точность). Однако по мере удаления объекта от начала координат точность его позиционирования начинает снижаться. Например, на расстоянии 1 км от начала координат (1 000 000 мм) точность позиционирования падает до 0,125 мм. Если же объект находится на расстоянии 64 км от начала координат, точность позиционирования снижается до 4 мм, т.е. разрешение теперь составляет лишь четверть от возможного при использовании целых чисел.

Дальше положение дел становится еще хуже. Если объект находится вблизи границы пространства, которое может быть определено с помощью целых 32-битных чисел, отстоящей от начала координат на 232 мм = 4295 км (это примерно соответствует расстоянию от Москвы до Иркутска), то, поскольку мы располагаем только 23 бит мантиссы, точность падает уже до 29 = 512 мм (т.е. приблизительно до 0,5). Таким образом, если использовать 32-битные числа с плавающей запятой (тип данных float в языке C/C++), например для задания позиции объектов при программировании в ЗЭ-геоинформа- ционной системе (ГИС), охватывающей всю континентальную часть Российской Федерации, то местоположение объектов в некоторых сильно удаленных городах может быть указано с точностью до 0,5 м; такая точность может считаться недостаточной. Если при программировании в той же самой ГИС использовать 32-битные целые числа, то местоположение объектов может быть указано с одинаковой точностью в любом городе, вне зависимости от его удаленности от начала координат.

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

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >