В числах с фиксированной запятой положение запятой в разрядной сетке машины заранее обусловлено для всех чисел раз и навсегда. Поэтому в коде числа запятая никак не обозначается. В большинстве машин место запятой подразумевается после последней цифры (справа от нее). А такие числа - целые. При необходимости представлять дробные числа с использованием формы с фиксированной запятой программист должен алгоритмическими средствами обеспечить использование множителя, выполняющего функцию масштабирования (масштабного множителя).
Определим диапазон представимых чисел.
Вначале рассмотрим пример, в котором положим, что мы имеем дело с десятичной (а не двоичной) системой счисления, и что для записи абсолютной величины числа (без учета его знака) в нашем распоряжении имеется шесть разрядов.
Тогда максимальное (по абсолютной величине) целое будет равно 999999 или иначе 10**6-1. А поскольку в разрядной сетке машины для записи знака числа всегда предусматривается один разряд, то для нашего случая диапазон представимых чисел составит все целые числа, начиная от
-999999 до +999999, а количество различных целых - 2*10**6-1.
В двоичных ЭВМ их разрядность определяется числом разрядов в слове. Так, если разрядность некоторой ЭВМ равна 16, то один разряд отводится для кодирования знака числа, а остальные 15 - для записи его величины. При этом максимальное по модулю целое значение в машинном слове будет равно 2**15-1, что составит 32767. (Посмотрите диапазон целых (integer) чисел в языке программирования Паскаль для ПЭВМ типа IMB PC).
В общем случае, если разрядность машины составляет N битов. Тогда максимальное по абсолютной величине целое число, которое можно в ней записать, будет равно 2**(N-1)-1.
Особенности арифметических операций над числами
Поскольку (если положение запятой фиксировано после последней цифры числа) числа с фиксированной запятой - целые, они представляются в машине точно. А потому операции сложения, вычитания и умножения корректны всегда: как операнды, так и результат - целые числа.
Единственной особенностью, о которой необходимо упомянуть, является ситуация, которая носит название “переполнение разрядной сетки” (FixedOverflow - переполнение с фиксированной запятой) и которая возникает, когда результат умножения превышает максимально возможное для данной разрядности значение. Эта ситуация считается в ЭВМ исключительной. При ее возникновении записать получившееся значение невозможно. В этом случае устанавливается в “1” специальный флаг переполнения, старший бит результата (бит переноса из старшего разряда слова) теряется, а в качестве результата выдается искаженное число. Описываемая ситуация не считается критической, и после окончания данной операции вычисления продолжаются. Таким образом, программист сам должен позаботиться о корректной реакции на возникновение переполнения, используя для обнаружения указанной ситуации содержимое флага переполнения.
Иначе обстоит дело с операцией деления. При делении целого числа на другое целое результат совсем не обязательно должен быть целым. А поскольку и результат должен быть представлен целым числом, возникает коллизия, которую проиллюстрируем примером:
5 / 2 = 2
5 / 3 = 1
5 / 4 = 1
5 / 5 = 1
5 / 6 = 0
И в отличие от умножения, с позиций ЭВМ никаких ошибок при этом нет, и никакие флаги не устанавливаются, а указанные особенности деления целых должны учитываться программистом самостоятельно. В ряде языков программирования эти особенности отражаются набором допустимых арифметических операций. Так, например, в языке Паскаль для целых (integer) определены две операции:
div - целочисленное деление, при котором в качестве результата представляется целая часть частного,
mod - остаток от деления целых (деление по модулю), при котором в качестве результата представляется целый остаток от деления, по абсолютной величине меньший делителя.
Примеры:
5 div 3 = 1
5 mod 3 = 2
Числа с плавающей запятой
В форме с плавающей запятой число представляется двумя компонентами : мантиссой и порядком. Мантисса используется для записи цифр числа, а порядок - для указания положения запятой.
Разрядная сетка машины в этом случае делится на несколько частей:
один разряд - для кодирования знака числа (это всегда самый старший, левый, разряд слова);
M разрядов - для записи мантиссы;
Р разрядов - для записи порядка (с учетом его знака).
Местоположение запятой при этом тоже строго фиксируется: считается, что мантисса всегда представляется как число, меньшее единицы, но такое, в котором первая цифра после запятой для всех абсолютно чисел отлична от нуля (единственное исключение составляет число 0). Такая форма представления мантиссы называется нормализованной. Иначе говорят, что мантисса нормализована (приведена к виду: 1 < M <= 0,1).
Ну, а если известно, что мантисса имеет вид “0,цццц..”, то ее код в машинном слове может не содержать символов “0,”, а местоположение запятой предполагается перед старшей значащей цифрой мантиссы.
Порядок Р всегда представляется целым числом со знаком + или -. А для кодирования абсолютной величины порядка остается (Р-1) цифр.
Теперь можно рассмотреть диапазон представимых чисел.
Вначале рассмотрим пример применительно к двоичной системе счисления.
Пусть m - количество разрядов мантиссы,
р - количество разрядов порядка, включая знаковый.
Тогда максимальное по абсолютной величине число будет равно
0,1111..1 * 2**(+111..1) = (1-2**(-м))*2**(2**(р-1)-1),
m цифр (p-1) цифр
или приблизительно 2**(2**(р-1)-1),
а минимальное по абсолютной величине число
0,1000..0 * 2**(-111..1) = 2**(-2**(р-1)).
m цифр (p-1) цифр
Итак, число в форме с плавающей запятой представляется последовательностью битов без каких либо явно указанных разделителей, но функционально разбитой на три группы {(знак числа, мантисса числа, порядок числа) или (знак числа, порядок числа, мантисса числа)}.
Рассмотренная форма кодирования числа приводит к следующим последствиям:
· Диапазон чисел, представимых в форме с плавающей запятой, определяется главным образом разрядностью порядка (Р).
· Разрядность мантиссы (М) определяет точное количество значащих цифр в изображении числа.
Следовательно, большинство чисел в форме с плавающей запятой представляется приближенно и причиной этого является ограниченное число разрядов мантиссы. Величина же абсолютной погрешности при приближенном представлении числа зависит как от абсолютной величины числа, так и от разрядности мантиссы и порядка.
Рассмотрим примеры. При этом для простоты положим, что числа представляются в десятичной системе счисления, количество цифр мантиссы равно 4, количество цифр порядка - 2, знак порядка записывается как в математике, а знак числа мы не изображаем, полагая все числа положительными.
Пример 1. Пусть имеется число 12,42=0,1242*10**(+2).
В заданном формате оно представляется цепочкой символов
1 2 4 2 + 0 2
При этом
· цепочка “1 2 4 2” представляет мантиссу, т.е. в математическом смысле число 0,1242 ,
· а цепочка “+ 0 2” - порядок - целое положительное число 2.
Тогда ближайшее большее этого число может быть задано цепочкой
1 2 4 3 + 0 2
и оно равно 0,1243*10**(+2)= 12,43.
Таким образом, ближайшие числа на числовой оси, которые различимы при кодировании их в форме с плавающей запятой для данного примера различаются на 0,01 (абсолютная погрешность представления всех чисел между 12,42 и 12,43 имеет верхнюю оценку 0,01).
Пример 2. Пусть имеется число 0,001242=0,1242*10**(-2).
В заданном формате оно представляется цепочкой символов
1 2 4 2 - 0 2,
а ближайшее большее этого число представляется цепочкой
1 2 4 3 - 0 2
и равно 0,1243*10**(-2)= 0,001243.
Таким образом, абсолютная погрешность представления всех чисел между 0,001242 и 0,001243 имеет верхнюю оценку 0,000001.
Пример 3. Пусть имеется число 0,1242*10**(+12).
В естественной форме записи это число 124 200 000 000, а в заданном формате оно представляется цепочкой символов
1 2 4 2 + 1 2,
а ближайшее большее этого число представляется цепочкой
1 2 4 3 + 1 2
и равно 0,1243*10**(+12)= 124 300 000 000.
Таким образом, абсолютная погрешность представления всех чисел между 124 200 000 000 и 124 300 000 000 имеет верхнюю оценку 100 000 000 = 10**8.
Обратите внимание, что в последнем примере невозможно записать ни одного числа в интервале размером 10**8.
Важный вывод, который следует из анализа формы кодирования чисел с плавающей запятой и иллюстрируется в рассмотренных примерах: числа в форме с плавающей запятой, несмотря на то что, эта форма предложена для представления в ЭВМ непрерывных величин, представляются дискретным множеством на числовой оси и располагаются на ней неравномерно.
Если изобразить на (бесконечной) числовой оси области существования чисел, то можно выделить следующие области (см. рис.):
1 2 3 4 5 6
R
МаксВещ -МинВещ 0 +МинВещ +МаксВещ
· область 1: Х<-МаксВещ - ни одного значения из области нельзя представить в машинном слове (МаксВещ - максимальное по абсолютной величине число, которое можно закодировать);
· область 2: -МаксВещ<=X<=-МинВещ - в данном интервале может быть представлено столько различных чисел, сколько их можно записать по заданной разрядности мантиссы и порядка;
· область 3: -МинВещ<X<0 - ни одного значения из этой области представить в машинном слове нельзя;
· область 4: 0<X<+МинВещ - ни одного значения из этой области представить в машинном слове нельзя;
· область 5: +МинВещ>=X>=+МаксВещ - в данном интервале может быть представлено столько различных чисел, сколько их можно записать по заданной разрядности мантиссы и порядка;
· область 6: X>+МаксВещ - ни одного значения из области нельзя представить в машинном слове (МаксВещ - максимальное по абсолютной величине число, которое можно закодировать).
Особое место занимает величина 0. Она также кодируется в форме с плавающей запятой, причем как ее порядок, так и мантисса(!) полагаются равными нулю.
Особенности арифметических операций над числами
При выполнении арифметических операций все четыре действия арифметики корректны. Следует однако иметь в виду, что дискретный характер представления чисел в форме с плавающей запятой и разбиение числовой оси на области, в ряде из которых невозможно представить ни одного числа, приводит:
· Во-первых, к тому, что при выполнении арифметической операции теоретически возможно формирование результата, который попадает в области 2 или 5, но который нельзя закодировать в форме с плавающей запятой точно. В этом случае, результат заменяется ближайшим из множества допустимых значений с учетом правила округления (ошибка метода представления чисел, вызванная ограниченной разрядностью мантиссы).
· Во-вторых, к тому, что при выполнении арифметической операции теоретически возможно формирование результата, который попадает в область 1 или в область 6. Этот случай является критическим, поскольку результат представить нельзя принципиально. Рассматриваемая ситуация называется “Переполнение с плавающей запятой” (Overflow), а при ее возникновении происходит аппаратное прерывание работы ЭВМ и выполнение программы аварийно прекращается. Причиной этого является ограниченная разрядность порядка.
· В-третьих, к тому, что при выполнении арифметической операции теоретически возможно формирование результата, который попадает в область 3 или в область 4. Рассматриваемая ситуация называется “Потеря значимости”, а при ее возникновении результат заменяется ближайшим допустимым, как правило нулем. Выполнение программы после этого продолжается. В некоторых ЭВМ при этой ситуации вырабатывается предупредительное (информационное) сообщение. Причиной этой ситуации также является ограниченная разрядность порядка.
В заключении отметим, что при выполнении арифметических операций мантиссы чисел и их порядки обрабатываются по разным алгоритмам. При этом в операциях сложения и вычитания чисел порядки выравниваются за счет сдвига мантиссы меньшего операнда на число разрядов, равное разнице порядков операндов, а в операциях умножения и деления порядки чисел соответственно складывают или вычитают. Поскольку, как мы уже видели раньше, вычитание алгебраических чисел (т.е. с учетом их знаков) в прямом коде реализовать не просто, а порядки представляются как числа целые со знаком в прямом коде, в ряде ЭВМ при представлении числа с плавающей запятой порядок числа заменяется его характеристикой.
Характеристика числа получается из его порядка, если осуществить преобразование координат: Значение 0 на оси, изображающей характеристику, совпадает с значением -МаксПорядок:
Порядок:
МаксПорядок 0 +МаксПорядок
Характеристика:
0 МаксХаракт.
При этом характеристика числа рассматривается только как положительное число, а следовательно, в нем не надо и кодировать знак. Признаком же того, какой знак имеет порядок некоторого числа, является содержимое старшего разряда характеристики: Если он равен 0 - порядок отрицательный, в противном случае - порядок положительный. В случае записи характеристики цепочкой цифр 1000..0 принимается, что порядок равен нулю.
Рассмотрим еще одну ситуацию, типичную для операции над числами в форме с плавающей запятой.
Пусть необходимо вычислить разницу чисел
X=13,45 и Y=13,45*10**(-5) ,
при условии, что они представлены в форме с плавающей запятой при разрядности мантиссы, равной 4, и порядка, равной 2. Для простоты операцию проиллюстрируем на примере десятичной системы счисления.
Запишем числа Х и Y в форме с плавающей запятой:
X: 1 3 4 5 + 0 2
Y: 1 3 4 5 - 0 3
Как видно из этой записи, оба числа представлены в форме с плавающей запятой без искажения. Не воспроизводя логику вычитания, принятую в ЭВМ, выполним вычитание в столбик. Для этого представим оба операнда в естественной форме и так, чтобы соответствующие разряды операндов находились друг под другом :
X: 1 3 , 4 5
Y: 0 , 0 0 1 3 4 5
=============
X-Y: 1 3 , 4 4 8 6 5 5
Округлим результат, учитывая, что в нашем распоряжении для записи цифр числа имеется всего 4 разряда, и запишем его вновь в форме с плавающей запятой, в заданной разрядной сетке:
X-Y: 1 3 4 5 + 0 0
Сравнив результат с исходными операндами увидим, что хотя оба операнда были отличны от нуля, результат и уменьшаемое полностью совпадают!
Вывод. При вычитании двух чисел большое значение имеют соотношение их величин и разрядность мантисс, используемая для их кодирования. Так что программисты могут столкнуться с нежелательными последствиями выполнения указанных действий в некоторых критических местах алгоритма. Например, если подобное вычитание выполняется в условии прекращения цикла, имеющем вид “(X-Y)>0.01”, то данное условие может никогда не выполниться, т.е. произойдет так называемое зацикливание.
Дополнительная литература по материалу раздела.
1. Савельев А.Я. Прикладная теория цифровых автоматов. Учебник для втузов. М.: 1989.
Дата: 2019-12-10, просмотров: 229.