RSS    

   Реферат: Арифметические основы ЦВМ

Иначе обстоит дело с операцией деления.  При делении целого числа на другое целое результат  совсем  не  обязательно  должен быть целым.  А поскольку и результат должен быть представлен целым числом,  возникает коллизия,  которую проиллюстрируем примером:

               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

1.5.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.


Страницы: 1, 2, 3, 4, 5, 6


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.