8-900-374-94-44
[email protected]
Slide Image
Меню

С точкой плавающей операции – Всё, точка, приплыли! Учимся работать с числами с плавающей точкой и разрабатываем альтернативу с фиксированной точностью десятичной дроби

Операции с плавающей точкой

Правило сложения (вычитания):

пусть,– два нормализованных двоичных числа, и(в противном случае мы можем просто поменять их местами). В результате их сложения или вычитания будет получено следующее выражение:

.

Последовательность вычислений следующая:

  1. Порядки чисел A и B выравниваются по большему из них (в нашем случае это nA). Для этого мантисса числа B сдвигается на nA-nB разрядов вправо (часть значащих цифр при этом могут оказаться утерянными), а его порядок становится равным nA.

  2. Выполняется операция сложения (вычитания) над мантиссами с округлением по значению n+1-ой значащей цифры результата.

  3. Мантисса результата должна быть нормализована (получившийся после нормализации порядок может отличаться от n

    A как в меньшую, так и в большую сторону).

Если порядки равны, сложение-вычитание выполняется следующим образом:

A1 = m1pn

A2 = m2pn

Тогда:

A1 + A2 = m1pn + m2pn = (m1 + m2)pn

A1 - A2 = m1pn - m2pn = (m1 - m2)pn

Если порядки отличаются, то необходимо вначале их выровнять:

A1 = m1 pn1

A2 = m2 pn2

Тогда A1 + A2 = m1 pn1 + m2 pn2 = (m1 + m2pn2-n1) pn1

После чего нужно привести m2pn2-n1 к нормальному (т.е. к обычному, без показателя степени) виду, сложить с m1, полученный результат и будет мантиссой суммы, а порядком суммы будет n1.

Умножение-деление

A1 = m1pn1; A2 = m2pn2

Тогда:

A1 * A2 = m1pn1 * m2pn2

= m1 * m2 * pn1* pn2 = (m1 * m2) * pn1+n2

A1 / A2 = m1pn1 / m2pn2 = m1 / m2 * pn1 / pn2 = (m1 / m2) * pn1-n2

То есть, при умножении нужно перемножить мантиссы и сложить показатели степени, при делении – разделить мантиссы и вычесть из показателя степени делимого показатель степени делителя. Например:

(1,2·105) · (2·10-2) = (1,2 · 2) ·105-2 =2,4·103

5. Основные понятия алгебры высказываний. Логические операции

Логические операции

Компьютер выполняет не только арифметические, но и логические операции, используя понятие истины (1, True, T) или ложь (0, False, F). Большое количество технических устройств компьютера, а также программных систем (экспертных, поддержки управленческих решений, интеллектуальных и т.д.) работают на основании математической логики, из всех разделов которой наибольшую популярность приобрели исчисление высказываний и исчисление предикатов.

Исчисление высказываний.

Цель исчисления высказываний состоит в определении их истинности или ложности на основании исходных посылок. В основе такого рода исчислений находится понятие «высказывание», связном повествовательном предложении, о котором можно сказать, истинно оно или ложно. Например, среди следующих предложений:

  1. Два умножить на три равно шесть.

  2. 5 > 7.

  3. Река Волга впадает в Балтийское море.

  4. Какая завтра будет погода?

высказываниями являются 1, 2 и 3 предложения и среди них лишь 1 будет истинным. Пример 4 не является высказыванием, так как нельзя сказать истинно оно или ложно.

Логику высказываний не интересует то, о чем идет речь в высказывании. Ее интересует лишь его истинность или ложность, так как она необходима для рассмотрения суждений без учета их внутренней структуры. Логика высказываний использует содержательные символы – выражения языка, имеющие смысл даже в том случае, если они взяты сами по себе. Высказывания обозначаются большими буквами латинского алфавита. Если высказывание A истинно, то пишут A = 1, если ложно, то используют запись A = 0.

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

Операция отрицания

Операция логического отрицания осуществляется над одним высказыванием. Выполнить операцию логического отрицания (обозначается ) – значит получить из данного высказывания новое, присоединяя слова «неверно, что …» ко всему высказыванию. Например, если А = «Луна спутник Земли», то = «неверно, что Луна спутник Земли», что ложно. Истинность высказывания определяется таблицей:

Отрицание

А

1

0

0

1

Отсюда следует, что отрицание высказывания истинно тогда и только тогда, когда высказывание А ложно.

Операция конъюнкции

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

А= «Земля круглая» и В= «Луна –спутник Земли», тогда их конъюнкцией будет так же истинное высказывание «Земля круглая и Луна – спутник Земли» (А=1, В=1; 1·1=1). В случае, если хотя бы одно из высказываний ложно, например В = «Марс - спутник Земли», их конъюнкция «Земля круглая и Марс – спутник Земли» так же будет ложным высказыванием (А=1, В=0; 1·0)=0. Истинность конъюнкции определяется таблицей:

Конъюнкция

А

В

АВ

0

0

0

0

1

0

1

0

0

1

1

1

Операция дизъюнкции

Дизъюнкция (логическое сложение) соответствует союзу 'или' в русском языке.

Например, высказывание A – «Декабрь – зимний месяц», В – «В январе сильный мороз», определим высказывание A+B как «Декабрь – зимний месяц или в январе сильный мороз» (А=1; В=1 или В=0; 1+1=1 или 1+0=1). Дизъюнкция истинна, если хотя бы одно из высказываний истинно. Установить истинность логической суммы можно с помощью следующей таблицы:

Дизъюнкция

А

В

А+В

0

0

0

0

1

1

1

0

1

1

1

1

То есть дизъюнкция двух высказываний ложна тогда и только тогда, когда оба высказывания ложны.

Эквиваленция высказываний А, В - это высказывание, обозначаемое и определяемое следующей таблицей:

Эквиваленция истинна тогда и только тогда, когда образующие её высказывания А, В имеют одинаковые значения.

Импликация

Импликации соответствуют конструкции 'Если ..., то ... ' (' Из ... следует ...').

Импликация высказываний А и В обозначается как

. Ее истинность определяется следующей таблицей:

Импликация

А

В

0

0

1

1

0

0

0

1

1

1

1

1

Импликация ложна тогда и только тогда, когдаА

- истина, В - ложь.

Допустим А = «Цены высоки» и В = «Товаров продано мало». Тогда импликация является истинным. Элементы высказывания, образующего импликацию, имеют специальные названия:А - посылка (гипотеза, антецедент), В - заключение (вывод, консеквент ).

Формулы исчисления высказываний. Таблицы истинности

Формулы исчисления высказываний – это высказывания, которые могут быть получены из элементарных высказываний (например A, B, 1, 0) посредством применения логических операций отрицания, конъюнкции, дизъюнкции, импликации и эквиваленции. Формулы необходимы для исчисления истинности или ложности составных высказываний, то есть решения логических задач.

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

;

.

Полезными также являются следующие законы:

(закон склеивания),

(закон поглощения),

(закон обобщенного склеивания).

Тождественно истинные или тождественно ложные высказывания, если они встречаются в формулах, заменяются в них, соответственно единицей или нулем:

, .

Среди высказываний встречаются также и такие, в которых таблицы истинности совпадают. Эти высказывания называются эквивалентными. Эквивалентными являются, например, высказывания и .

studfiles.net

Глава 5. Операции над числами с плавающей точкой.

I. Для представления чисел с фиксированной точкой положение точки фиксируется в определенном месте относительно разрядов модуля числа в разрядной сетке (ячейке).

а) Точка фиксируется перед старшим цифровым разрядом числа

.

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

б) Точка фиксируется перед младшим цифровым разрядом

По сложившейся традиции нумерация разрядов сетки в больших машинах ведется слева направо, а в малых – справа налево.

В этом случае модулем числа является только целое число. При занесении числа в ячейку, число разрядов которого превышает число (n-2), теряются старшие разряды, которые могут дать погрешность до 100 %.

II. Числа с плавающей точкой.

В этом случае формат представления числа иной.

Вобщем случае представление числа с плавающей точкой имеет вид:, гдеq  1, SP - характеристика числа, p – порядок числа, S – основание характеристики.

Формат разрядной сетки:

Числа с плавающей точкой могут быть представлены и в других форматах: с основанием 8 и 16.

Число называютнормализованным, если мантисса q удовлетворяет следующему соотношению: 1/S.

В процессе вычисления может получиться ненормализованное число (в старших разрядах появляются нули). Тогда машина автоматически нормализует число.

Например: получен результат, в котором r старших разрядов – нулевые.

Нормализация заключается в сдвиге мантиссы q на r разрядов влево и одновременном уменьшении порядка на r единиц. При этом в младшие r разрядов мантиссы записываются нули. После этой операции число не меняется, а условие нормализации выполняется.

Поскольку арифметическое действие над числами с плавающей точкой требуют отдельных операций над мантиссами и порядками чисел, то операции над порядками сводят к операциям над целыми положительными числами, применяя представление чисел со смещенным порядком. Для этого при записи числа в ячейку памяти к порядку p прибавляется целое число смещения N=2k, где k – число двоичных разрядов, используемых для расположения порядка в разрядной сетке. Тогда смещенный порядок будет равен: pсм=p+N. Этот смещенный порядок всегда будет положительным, и будет при этом занимать то же число разрядов.

Свойство смещенного порядка: если p' > p'', то p'смp''см

Это говорит о том, что смещение порядка не влияет на операции над числами.

§ 5.1 Сложение и вычитание чисел с плавающей точкой.

Сложение и вычитание чисел плавающей точкой производится по формуле:

, пусть x > y

Алгоритм сложения / вычитания:

1) Производится выравнивание порядков чисел:

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

2) Производится сложение / вычитание мантисс, и получается сумма / разность мантисс.

3) Порядок суммы / разности принимается равным порядку большего числа.

4) Полученный результат нормализуется.

Арифметическое действие над порядками и мантиссами выполняется либо отдельными устройствами, либо последовательно одним устройством.

Операция сложения / вычитания состоит из следующих этапов:

1) прием операндов

2) выравнивание порядков со сдвигом мантисс

3) сложение / вычитание мантисс

4) нормализация результата

1) Прием операндов:

Прием слагаемого / вычитаемого х в регистр RG3. Фиксация знака числа (из 0) в триггере знака Тзн1. Установка регистра RG3 в ноль.

Прием второго слагаемого / вычитаемого y в RG1. Фиксация знака в триггере знака Тзн2. Установка регистра RGA в .

2) Операции над порядками:

Значение порядков из разрядов 1  7 регистров RG1 и RG3 подаются в регистры RGC и RGD.

Далее в блоке обработки порядков происходит их сравнение, по результатам которого мантисса с меньшим порядком сдвигается вправо на число разрядов, равное разности порядков. За порядок результата операции принимается больший из порядков.

При сравнении порядков возможны пять случаев их соотношения:

PxPym, где m – число разрядов мантиссы, за результат в этом случае принимается слагаемое х, так как при сдвиге мантиссы слагаемого y все ее разряды примут нулевое значение.

PyPxm, за результат принимается мантисса y.

PxPy = 0, производится суммирование / вычитание мантиссы.

PxPy = K1 (K1m), мантисса y сдвигается на K1 разрядов.

PyPx = K2 (K2m), мантисса x сдвигается на K2 разрядов.

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

Полученные модули мантисс хранятся в регистрах RG1 и RG3 в разрядах 831, их знаки – в триггерах знака Тзн1 и Тзн2, а принятый порядок хранится в регистре счетчика RGСч1.

3) Сложение / вычитание мантисс:

а) при одинаковых знаках чисел модули мантисс передаются в RGA и RGB и складываются в сумматоре.

Если в сумматоре в разряде 7 окажется единица, то возникло переполнение разрядной сетки, поэтому сумма сдвигается на разряд вправо, а порядок увеличивается на единицу, т.е. RG1 := RGСч1 + 1.

Если окажется, что в сумматоре в разряде 0 находится единица, то произошло переполнение порядка, поэтому вырабатывается сигнал прерывания вычислительного процесса.

Если переполнения порядка нет, то в регистр сумматора в разряды 1  7 заносится порядок из регистра счетчика RGСч1, в разряд 0 в регистр сумматора заносится знак мантиссы, а в разряды сумматора 8  31 заносится мантисса суммы.

Таким образом, в регистре сумматора полностью сформирован результат.

б) при разных знаках мантисс отрицательный из них передается на входной регистр RGA или RGB, в обратном коде производится суммирование с дальнейшим подсуммированием единицы.

Знак результата фиксируется в триггере знака. Если полученный результат нормализован, т.е. в разряде сумматора 8 находится единица, то в регистр сумматора заносится: знак результата – в 0, порядок – в 1  7, модуль мантиссы – в разряды 8  31.

Если результат не нормализован, т.е. в 8 находится ноль, и нет исчезновения мантиссы ([8  31]  0), производится нормализация сдвигом мантиссы влево с одновременным уменьшением порядка.

При отрицательном переполнении порядка, т.е. если RGСч1[0]=1, формируется признак исчезновения порядка, т.е. результат равен нулю.

Если нормализация происходит без исчезновения порядка, то формируется результат из кодов знака, порядка и мантиссы.

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

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

studfiles.net

Операции с плавающей точкой

•Термин «плавающая точка» означает, что двоичный

порядок, определяющий фактическое положение

точки в изображении числа, корректируется после

выполнения каждой арифметической операции

•Точка в изображении числа «плавает» (изменяется ее положение) по мере изменения данной величины

•Арифметические операции с числами в формате с

плавающей точкой намного сложнее таких же

операций для чисел в формате с фиксированной точкой

•Однако плавающая точка позволяет производить операции масштабирования автоматически и избавляет от накопления абсолютной погрешности при вычислениях

Операции с плавающей точкой

•При выполнении арифметических операций над

числами в формате с плавающей точкой надо отдельно

выполнять их для порядков и мантисс

•При алгебраическом сложении чисел надо сначала

уравнять порядки слагаемых

•При умножении порядки надо складывать, а мантиссы

— перемножать.

•При делении из порядка делимого вычитают порядок

делителя, а над мантиссами совершают обычную

операцию деления

•После выполнения операций, если это необходимо, проводят нормализацию результата, что влечет изменение порядков

Перевод дробной части вещественного числа в двоичную форму

•Дробную часть последовательно умножаем на 2 до

тех пор, пока очередная дробная часть произведения не окажется равной нулю

•Целые части полученных произведений, записанные

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

•Пример. Переводим дробь 0,62510: 0,625 * 2 = 1,250, 0,250 * 2 = 0,500,

0,500 * 2 = 1,000 (дробная часть числа равна 0)

•ОТВЕТ: 0,62510 = 0.1012

Кодирование текстовых данных

•Текст состоит из набора символов, каждому символу

соответствует порядковый номер

•В стандартных системах для кодирования каждого символа отведен 1 байт. Максимальное число символов, которые

можно закодировать равно 28=256

•Стандартная система кодирования символов ASCII состоит

из базовой (0-127символы) и расширенной (128 – 255) частей

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

•Базовая часть одна и та же для всех IBM совместимых PC

•Расширенная часть отведена для национальных систем.

В России используются КОИ-8, Windows-1251

•Новый общемировой стандарт Unicode, использующий двухбайтовую кодировку

studfiles.net

Плавающая точка - это... Что такое Плавающая точка?

Структура числа

Число с плавающей запятой состоит из:

  • Мантиссы (выражающей значение числа без учёта порядка)
  • Знака мантиссы (указывающего на отрицательность или положительность числа)
  • Порядка (выражающего степень основания числа, на которое умножается мантисса)
  • Знака порядка

Нормальная форма

Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) находится на полуинтервале [0; 1). Число с плавающей запятой, находящееся не в нормальной форме теряет точность по сравнению с нормальной формой. Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, 0,0001 можно записать в 4 формах - 0,0001 * 100, 0,001 * 10-1, 0,01 * 10-2, 0,1 * 10-3), поэтому распространена (особенно в информатике) также другая форма, в которой мантисса принимает значения от 1 (включительно) до 10 (не включительно). В такой форме любое число (кроме 0) записывается единственным образом. Недостаток заключается в том, что в таком виде невозможно представить 0, поэтому представление чисел в информатике предусматривает специальный признак (бит) для числа 0.

Использование в вычислительных машинах

В вычислительных машинах показатель степени принято отделять от мантиссы буквой "E" (exponent). Например, число 1,528535047 × 10-25 в большинстве языков программирования высокого уровня записывается как 1.528535047E-25.

Краткий обзор

Существует несколько способов того, как строки из цифр могут представлять числа:

  • Наиболее распространённый путь представления значения числа из строки с цифрами — в виде целого числа — запятая (radix point) по-умолчанию находится в конце строки.
  • В общем математическом представлении строка из цифр может быть сколь угодно длинной, а положение запятой обозначается путём явной записи символа запятой (или, на Западе, точки) в нужном месте.
  • В системах с представлением чисел в формате с фиксированной запятой существует определённое условие относительно положения запятой. Например, в строке из 8 цифр условие может предписывать положение запятой в середине записи (между 4-й и 5-й цифрой). Таким образом, строка "00012345" обозначает число 1,2345 (нули слева всегда можно отбросить).
  • В экспоненциальной записи используют стандартный (нормальный?) вид представления чисел. Число считается записанным в стандартном виде, если оно записано в виде aqn, где a такое, что , называется мантиссой, n — целое, называется показатель степени и q — целое, основание системы счисления (на письме это обычно 10). То есть в мантиссе запятая помещается сразу после первой значащей (не равной нулю) цифры, считая слева направо, а дальнейшая запись даёт информацию о действительном значении числа. Например, период обращения (на орбите) спутника планеты Юпитера Ио́, который равен 152853,5047 с, в стандартном виде можно записать как 1,528535047 × 105. Побочным эффектом ограничения на значения мантиссы является то, что в такой записи невозможно изобразить число 0.
  • Запись в форме с плавающей запятой похожа на запись чисел в стандартном виде, но мантисса и экспонента записываются раздельно. Мантисса записывается в формате с фиксированной запятой, подразумеваемой после первой цифры. Возвращаясь к примеру с Ио́, запись в форме с плавающей запятой будет 1528535047 с показателем 5. Это означает, что записанное число в 105 раз больше числа 1,528535047, то есть для получения подразумеваемого числа запятая сдвигается на 5 разрядов вправо. Однако, запись в форме с плавающей запятой используется в основном в электронном представлении чисел, при котором используется основание системы счисления 2, а не 10. Кроме того, в двоичной записи мантисса обычно денормализована, то есть запятая подразумевается до первой цифры, а не после, и целой части вообще не имеется ввиду - так появляется возможность и значение 0 сохранить естественным образом. Таким образом, десятичная 9 в двоичном представлении с плавающей запятой будет записана как мантисса +1001000...0 и показатель +0...0100. Отсюда, например, беды с двоичным представлением чисел типа одной десятой (0,1), для которой двоичное представление мантиссы оказывается периодической двоичной дробью - по аналогии с 1/3, которую нельзя конечным количеством цифр записать в десятичной системе счисления.

Запись числа в форме с плавающей запятой позволяет производить вычисления над широким диапазоном величин, сочетая фиксированное количество разрядов и точность. Например, в десятичной системе предоставления чисел с плавающей запятой (3 разряда) операцию умножения, которую мы бы записали как

0,12 × 0,12 = 0,0144

в нормальной форме представляется в виде

(1,20 × 10−1) × (1,20 × 10−1) = (1,44 × 10−2).

В формате с фиксированной запятой мы бы получили вынужденное округление

0,120 × 0,120 = 0,014.

Мы потеряли крайний правый разряд числа, так как данный формат не позволяет запятой «плавать» по записи числа.

Диапазон чисел, представимых в формате с плавающей запятой

Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 52 бита + 1 знаковый, показатель — 11 бит. Таким образом получаем диапазон точности примерно от 4,94 × 10−324 до 1.79 × 10308 (от 2−52 × 2−1022 до ~1 × 21024). Пара значений показателя зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся значения бесконечность), получающихся в результате операций типа деления на ноль нуля, положительных и отрицательных чисел. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы. В специализированных устройствах (например GPU) поддержка специальных чисел часто отсутствует. Существуют программные пакеты, в которых объём памяти выделенный под мантиссу и показатель задаётся программно, и ограничивается лишь объёмом доступной памяти ЭВМ.

dic.academic.ru

Блок операций с плавающей точкой

Компания Weitek также выпускала математические сопроцессоры для платформ 68000 и

Устройство FPU

Модуль операций с плавающей запятой представляет собой стековый калькулятор, работающий по принципу обратной польской записи. Перед операцией аргументы помещаются в LIFO-стек, при выполнении операции необходимое количество аргументов снимается со стека. Результат операции помещается в стек, где может быть использован в дальнейших вычислениях или может быть снят со стека для записи в память. Также поддерживается и прямая адресация аргументов в стеке относительно вершины.

Внутри FPU числа хранятся в 80-битном формате с плавающей запятой, для записи же или чтения из памяти могут использоваться:

  • один из трёх форматов с плавающей точкой (32, 64 и 80 бит),
  • целочисленные форматы (16, 32 и 64 бита),
  • 80-битный BCD-формат.

Поддерживаемые математические операции: арифметические операции, сравнение, деление по модулю, округление, смена знака, модуль, квадратный корень, синус, косинус, частичный тангенс, частичный арктангенс, загрузка константы (0, 1, число пи, log2(10), log2(e), lg(2), ln(2)) и некоторые другие специфические операции.

FPU умеет обрабатывать пограничные состояния с помощью специальных значений, представимых форматом с плавающей запятой:

  • денормализованное число (число, близкое к переполнению; при дальнейшем возрастании модуля денормализованное число становится бесконечностью),
  • бесконечность (положительная и отрицательная), возникает при делении на нуль ненулевого значения а также при переполнениях,
  • англ. not-a-number (NaN)). Нечисла могут определять такие случаи, как:
    • неопределённость (IND), возникает при комплексном результате (например, при вычислении квадратного корня из отрицательного числа) и в некоторых других случаях,
    • недействительное значение (qNaN, sNaN) - может использоваться компилятором (для предотвращения использования неинициализированных переменных) или отладчиком,
  • нуль - в формате с плавающей запятой, нуль также считается специальным значением.

В зависимости от флагов FPU, специальные значения могут инициировать обработку исключения операционной системой.

См. также

dic.academic.ru

Арифметические операции над числами с плавающей точкой / Habr

Все читатели Хабра так или иначе связаны с ИТ направлением. Будь ты программист или работаешь с железом, сетями и так далее, все мы знаем общие концепции.

Когда-то на втором курсе университета я познакомился как раз с одной из вещей, которую, по-моему, должен знать каждый из нас, ну или хотя бы услышать о ней вот в такой статье. Это стандарт представления чисел в формате с плавающей точкой(в других источниках с плавающей запятой). Как же въелось мне это название: стандарт IEEE-754.

Уверен, что каждый из айтишников хоть раз но слышал с числами в формате плавающей точкой, но для меня впервые это показалось полной чушью. И не с проста: ведь предмет, на котором мы изучали стандарт, назывался «Архитектура ЭВМ» да и преподаватель был, да и сейчас есть живой легендой. Ну, это оффтоп.

Итак, что же такое этот стандарт IEEE-754? Скажу сразу, что нам в университете дали его в электронном виде на русском, но в интернете я не смог его найти, даже дойдя до 30-й страницы гугла. Был пример на английском, в котором автор писал его в 4:36 АМ. Я даже нашёл сайт, в котором говориться, что если бы Сатана решил захватить Землю медленно, он бы создал этот стандарт. Но его создали люди, такие же, как и мы с вами.

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

По этому предмету в университете у нас рассчитывалась РГР (Расчётно-Графическая работа) и почему то тогда я понял, что стоит ей уделить больше времени, чем чему-либо и оказался прав. Это, наверное, был переломный момент моей учёбы. Я сидел ночами над этим стандартом и над конкретно поставленной передо мной задачей: «Деление двух чисел в формате с плавающей точкой двойной точности с заменой цепочек непрерывных единиц нулями и с округлением до ближайшего чётного». Тогда это нельзя было понять. И стандарт IEEE-754 всегда следовал рядом с этим заданием. На самом деле там было всё, абсолютно всё, что мне нужно было.

Ну, а теперь подробнее собственно, о стандарте IEEE-754. Он представляет собой несколько глав, которые я хотел бы описать поподробнее.
Всё как всегда начинается с введения. О том, что существуют программы, намного сложнее чем то, что я видел. Рассказывается об истории создания стандарта. Ведь программы становятся всё сложнее и сложнее, а ЦВМ стареет и следует заменить её новой архитектурой. Это послужило причиной тому, что IEEE (Институт инженеров по электротехнике и электронике США) в конце 70-х годов создал комиссию, рассмотревшую множество предложений. Результатом работы комиссии явился стандарт IEEE 754 ≪Двоичная арифметика с плавающей точкой≫ (1985г.), ставший международным. Его основы разработал профессор математики университета Беркли William Kahan.
В последующие годы на базе IEEE 754 – 1985 были разработаны стандарты:

— IEEE 854 – 1987, покрывающий десятичную арифметику также как и двоичную;

— IEC 60559 — 1989 IEC ≪Двоичная арифметика с плавающей точкой для
микропроцессорных систем≫ (IEC — International Electrotechnical Commission).

Стандарт IEEE 754 не обязывает, а рекомендует применение пакета оговоренных в нем форматов, способов кодирования данных, округления результатов и многое другое. Задача выбора формата для конструктора универсальной ЦВМ предельно упростилась, и с этого времени фирмы стали производить универсальные ЦВМ с арифметикой с плавающей точкой удовлетворяющей рекомендациям стандарта. Задача программистов также несколько упростилась, т.к. нет необходимости изучать особенности двоичной арифметики с плавающей точкой разных ЦВМ, достаточно овладеть знанием стандарта.
Но нужно помнить, что стандарты консервативны, но не вечны. И, тем не менее, этим стандартом пользуемся все мы с вами, коллеги.

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

И наконец-то, главный раздел – Выполнение операций над числами в формате с плавающей точкой. В этом разделе описаны все арифметические операции от сравнения до деления, а так же все нюансы при выполнении таких операций. Про этот раздел нельзя сказать вот так, «в двух словах». Скажу лишь, что это настоящая морока и передо мной встала задача понять, как это происходит.
Опишу вкратце свой алгоритм работы «Деление в формате с плавающей точкой». После того, как мы получили операнды А и В, нужно было проверить их на все возможные случаи возникновения исключительных ситуаций. Это и деление на ноль и Nan и бесконечность. Немного ниже, на таблице, изображены типы представления чисел, которые поддерживает формат:

Если операнды действительно являлись числами в формате IEEE-754, начинался второй этап выполнения операции: приведение порядков. Ни для кого не секрет, что числа в формате с плавающей точкой выглядят примерно так:

Это представление числа в формате с одинарной точностью.
Порядок числа в ЦВМ – это, в моём понимании, порядковый номер числа в ЦВМ, то есть его порядок. Наверняка есть научное определение, но оно лишь запутает ещё больше. Так вот, раз числа имеют разные порядки, их нельзя делить. Следует сначала привести порядки к одному виду смещением порядков. Но для этого требовалось проанализировать порядки на min и маx значение. А когда происходит смещение порядков, мантиссы тоже сдвигаются. Если порядки уравнены, нужно проверить мантиссы, не вылетели ли они за границы и не заполнились ли они нулями и т.д. Закончив ряд проверок, можно приступать к самому главному: наконец-то делить мантиссы. Ну, тут всё просто, как и вся двоичная арифметика. Я делил делитель на делимое, а остаток записывал в регистр и складывал. Там ещё есть несколько способов деления: с восстановление и без восстановления остатка. Да и это ещё не всё! В конце следовало округлить полученный результат по нужному условию и определить знак частного.

Это всего лишь на словах, хоть и звучит страшно, на деле выглядит куда лучше. Тогда я откровенно запал на этот стандарт, что принесло мне не только более глубокие знания в ЦВМ и двоичной арифметике, но и удовольствие что я смог это сделать, удовольствие осознавать то, что я знаю что-то очень важное.
У меня всё, на самом деле тема очень интересная и увлекательная. Кто заинтересовался, с удовольствием скину стандарт IEEE-754 и отвечу на ваши вопросы.

Спасибо.

habr.com

ОПЕРАЦИИ НАД ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ МК AVR

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

Для представления чисел с плавающей точкой разработан и введен стандарт IEEE-754, включающий базовый одинарный, базовый двойной, расширенный одинарный и расширенный двойной форматы, отличающиеся количеством разрядов и способами представления мантиссы и порядка. На рис. 3.8 приведена структура полей базового 32-разрядного одинарного формата. Формат содержит знаковый разряд S, 8-разрядное поле для смещенного порядка В и 23-разрядное поле для мантиссы F.

Рис. 3.8. Базовый одинарный формат

В этом формате при изображении порядка используется смещение, равное 127, скрытый бит целой части мантиссы Fq, содержащий 1. Минимальный (Е = 0) и максимальный (В = 255) порядки

зарезервированы для представления специальных чисел. Диапазон

± 38

представления чисел в этом формате составляет ±10 , а точность 6-7 десятичных разрядов. Приведем несколько примеров кодирования чисел в этом формате:

В рассмотренных далее алгоритмах для 8-разрядных микроконтроллеров принимается представление истинного нуля нулевым набором (знак, порядок, мантисса). Специальные числовые значения из стандарта (на изображения бесконечности, неопределенности) учитывать не будем.

Во всех приводимых программах арифметических операций для микроконтроллеров AVR принято размещение исходных операндов и результатов во второй половине регистров общего назначения (R16…R31). Первый операнд, символически обозначаемый А, размещается в четырех регистрах А: рА (порядок), шАН, тАМ, rtiAL (старший, средний и младший байты мантиссы). Второй операнд, символически обозначаемый В, размещается в регистрах В: рВ (порядок), тВН, шВМ, mBL (мантисса). Результат помещается перед выходом из процедуры в регистры рА, шАН, тАМ, mAL.

Сложение

Процедура сложения чисел с плавающей точкой одного знака включает следующие действия:

•    определяется разность порядков слагаемых Ар = (рА – рВ). При неравенстве порядков, если разность порядков больше О, сдвигается мантисса числа В вправо до тех пор, пока порядок меньшего числа В не станет равным большему; если разность порядков меньше О, сдвигается мантисса числа А вправо;

•    после выравнивания порядков слагаемых при Ар = О производится сложение мантисс. В качестве порядка суммы принимается рА или рВ;

•     проверяется мантисса суммы на возможность нарушения нормализации. При сложении чисел с одинаковыми знаками возможно нарушение нормализации только влево на один разряд. Чтобы получить нормализованную мантиссу, необходимо сдвинуть ее вправо. Порядок увеличивается на единицу, что может привести к переполнению.

На рис. 3.9 приведена схема алгоритма сложения чисел А и В с плавающей точкой и одинаковыми знаками. Каждое слагаемое представлено однобайтовым порядком и трехбайтовой мантиссой в стандартном формате: знак числа, 8-разрядный смещенный порядок, 23-разрядная мантисса со скрытой единицей (всего 32 разряда). Число А перед началом операции размещено в регистрах рА, тАН, шАМ, mAL, число В – в регистрах рВ, рВИ, рВМ, pBL. Результат операции сохраняется на месте первого операнда А.

Рис. 3.9. Схема алгоритма сложения с плавающей точкой

Процедура сложения с плавающей точкой AddF начинается с проверки знаков слагаемых. Если знаки операндов не совпадают, знак второго операнда изменяется на противоположный и выполняется переход к процедуре вычитания чисел SubF. Если исходные операнды имеют один знак, каждый из них проходит проверку на равенство 0. Если один из операндов равен О, сложение не проводится, а результат принимается равным другому операнду. При этом в случае равенства О первого операнда регистры А и В обмениваются операндами. На этом операция заканчивается. Преобразование результата в стандартный формат не проводится.

Если оба операнда ненулевые, в однобитовом флаге Т регистра состояния микроконтроллера SREG сохраняется общий знак операндов и выполняется их восстановление из базового формата. Поскольку для этого используется одна и та же процедура гес из библиотеки вспомогательных процедур, настроенная на работу с регистрами А, перед вторым восстановлением проводится обмен операндами.

Далее вычитают порядки. При получении отрицательной разности выполняется обмен операндами и вычитание повторяется. При равенстве порядков, когда их разность Ар = О, выполняется переход к сложению мантисс. В противном случае предварительно разность Ар сравнивается с длиной мантиссы. Если разность превысит 24, то при выравнивании порядков со сдвигом вправо мантиссы меньшего числа она покинет разрядную сетку, происходит потеря значимости. В качестве результата принимается операнд, который в этот момент находится в регистрах первого операнда (рА, шА). Если разность меньше 24, переходим к сдвигу мантиссы меньшего числа, поместив ее в регистры (тАН, шАМ, mAL), разность порядков – в регистре рВ, меньший порядок – в регистре рА. Сдвиг мантиссы вправо сопровождается увеличением порядка в регистре рА, уменьшением в регистре рВ и продолжается до тех пор, пока в регистре рВ не получим 0.

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

Алгоритм сложения чисел с одинаковым знаком представлен листингом программы 3.3. Программа позволяет выполнить алгебраическое сложение чисел с учетом знаков слагаемых. В том случае, когда слагаемые имеют разные знаки, происходит обращение к модулю вычитания. С помощью директивы .include "flsub.asm" подключают программный модуль вычитания чисел с плавающей точкой одинаковых знаков. Это позволяет в дальнейшем выполнить посредством одной и той же программы не только сложение, но и вычитание чисел.

В начале общей программы сложения;вычитания выполняют проверку кода выполняемой операции: 1 – для сложения (+), 2 – для вычитания (-). В зависимости от заданной операции и знаков операндов запускают процедуру сложения или вычитания беззнаковых чисел (табл. 3.4). При необходимости производится перемена мест операндов. В итоге можно применить одну из двух процедур: сложение или вычитание модулей чисел.

Таблица 3.4. Выполняемые операции

Программа 3.3

;Программа 3.3 сложения;вычитания чисел с плавающей точ- ; кой.

;Первый операнд находится в регистрах рА, гпАН, шАМ, mAL, ;второй – в регистрах рВ,тВН, тВМ, mBL. Результат ;возвращается в регистры первого операнда. При переполне- ;нии флаг С устанавливается в 1. Вызываемые процедуры

;расположены в файлах flsub.asm (модуль вычитания) и ;fllib.asm (библиотечные модули)

.include "8515def.inc" ;файл определений для AT90S8515 ;.include "m8515def.inc" ;файл определений для ATmega8515 .def temp = г1б                          ;временный регистр

.def асс = г17            ;регистр аккумулятор

.def сор = г18            ;код операции:

; 1 – сложение, 2 – вычитание .def рА = г20 ;операнд А (рА – байт порядка),

.def mAH = г21            ;(mAH, mAM, mAL – байты мантиссы)

.def mAM = г22 .def mAL = г23

.def pB = r24             ;операнд В (рВ – байт порядка),

.def тВН = г25            ;(тВН, тВМ, mBL – байты мантиссы)

.def тВМ = г2б .def mBL = г27

.org $000

Idi temp, low(RAMEND) ;инициализация указателя стека

out spl, temp

Idi temp, high(RAMEND)

out sph, temp

cpi cop,0x01              ;проверка кода операции

breq AddF rjmp SubF

;модуль сложения чисел с плавающей точкой ; с одинаковым знаком AddF: mov асс,рА eor асс,рВ brpl AddFl

Idi temp,0x80             ;изменение знака

add pB,temp rjmp SubF

AddFl: rcall cp_B_0       ;сравнение В с 0

breq Quit

rcall cp_A_0              ;сравнение A с 0

brne AddF2

rcall swapAB              ;обмен A и В

rjmp Quit

AddF2: bst pB, 7          ;сохранение знака Т=рВ.7

rcall rec                 ;восстановление

rcall swapAB              ; чисел через регистры A

rcall rec

mov acc,pA                ;вычитание порядков

sub асс,рВ

brpl AddF3         ;переход, если больше О,

rcall swapAB       ; иначе обмен и

mov асс,рА            ; снова вычитание sub асс,рВ

AddF3: breq AddF6     ;переход, если порядки равны

cpi асс,24            ;сравниваем brmi AddF4

rjmp AddF7         ;переход при потере значимости

AddF4: mov рА,асс     ;разность порядков в рА

rcall swapAB       ;разность теперь в рВ

AddFS: rcall shift    ;сдвиг в регистрах тА

inc рА             ;увеличиваем порядок меньшего числа

dec рВ                ;уменьшаем разность порядков brne AddFS

AddF6: add mAL,mBL        ;сложение мантисс adc mAM,mBM adc mAH,mBH

brcc AddFV         ;проверка нарушения нормализации

inc pA             ;корректируем порядок

breq Quit          ;выход с флагом переполнения

rcall shift        ;сдвиг мантиссы вправо

AddF7: rcall pack     ;форматирование результата Quit: rjmp Quit

.include "flsub.asm" ;подключение модуля вычитания .include "fllib.asm" ; и библиотечных процедур

Типовые процедуры, используемые алгоритмами сложения;вычитания, помещены в библиотеку, подключаемую директивой .include "fllib.asm". Библиотека fllib содержит процедуры восстановления операнда из базового формата гес, упаковки в базовый формат раек, обмен операндов swapAB, сдвига мантиссы вправо на один разряд shift, логического сложения 24-разрядной мантиссы для сравнения с нулем.

Восстановление числа из базового формата производится с помощью четырех операций, как показано на рис. 3.10, а. Вначале при помощи логического сдвига влево ф младший бит порядка из регистра старшего байта мантиссы шАН выталкивается на флаг переноса С. Затем выполняется циклический сдвиг влево содержимого регистра порядка рА Благодаря этому 8-разрядный порядок полностью оказывается в регистре рА. Далее мантисса шАН сдвигается вправо @ и в разряд 7 регистра шАН восстанавливается скрытая 1

Рис. зло. Схема восстановления числа из базового формата {а) и преобразования в базовый формат {б)

Преобразование результата операции, помещаемого после обработки в регистры А, в базовый формат выполняется по схеме на рис. 3.10, б. Вначале сохраняем порядок рА в одном из регистров, например рВ ф. Затем знак результата, сохраняемый на флаге Т, переносим на флаг С Выполняя сдвиг вправо регистра порядка рА, вводим знак числа в разряд 7 регистра рА Передачу младшего бита порядка в старший разряд мантиссы шАН выполняем за два шага: сначала из разряда О регистра рВ в Т затем из Т в разряд 7 регистра шАН ® на место старшего разряда мантиссы.

Обмен 32-разрядных операндов в регистрах А и В осуществляется с использованием логической функции Исключающее ИЛИ. Действительно, получив сначала А <— А Ф В, выполняем далее В<-ВФАиА<-АФВ. Эти операции повторяют отдельно для каждого байта порядка и мантиссы (всего 12 операций). Используемые библиотечные процедуры с комментариями представлены в листинге программы 3.4.

Программа 3.4

;Модуль 3.4 библиотечных процедур fllib.asm

;Восстановление операнда из базового формата гес: Isl mAH   ;младший разряд порядка в С

го1 рА             ;восстановление порядка

Isr mAH            ;сдвиг вправо мантиссы

ori mAH, 0x80       ;восстановление скрытой 1

ret

;Упаковка в базовый формат раек: mov pb,pa     ;сохраняем рА

с1с

brtc m2            ;проверяем знак

sec

m2: ror рА                 ;вводим знак в рА.7

bst pb,0           ;младший разряд порядка

bid mAH,7          ; переносим в АН.7

ret

;Обмен операндов swapAB:

еог рА,рВ           ;обмен регистров

еог рВ,рА           ; рА и рВ

еог рА,рВ           ; за три операции

еог mAL,mBL еог mBL,mAL еог mAL,mBL еог тАМ,тВМ еог тВМ,тАМ еог тАМ,тВМ

еог тАН,тВН еог тВН,тАН еог тАН,тВН

ret

;Сложение для сравнения А(В) с О ср_А_0: mov асс,рА or acc,mAH or acc,mAM

or acc,mAL       ;при A=0 возвращает флаг Z=1

ret             ;при A^O – Z=0

cp_B_0: mov acc,pB or acc,mBH or acc,mBM

or acc,mBL       ;при B=0 возвращает флаг Z=1

ret             ;при     – Z=0

;Сдвиг вправо 24-разрядной мантиссы mA shift: Isr mAH ror mAM ror mAL clc ret

Вычитание

Операция начинается с проверьси знаков слагаемых (рис. 3.11). Если знаьси операндов не совпадают, знак вычитаемого изменяется на противоположный и выполняется переход к процедуре сложения чисел AddF. Если исходные операнды с одним знаком, каждый

Рис. 3.11. Схема алгоритма вычитания с плавающей точкой

проходит проверку на равенство 0. Если один из операндов равен О, вычитание не проводится, а результат принимается равным другому операнду, при необходимости корректируется знак результата.

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

Дальнейшие действия связаны с выравниванием порядков и сдвигом вправо мантиссы меньшего числа, которое находится в регистрах А. После выравнивания порядков выполняется вычитание мантисс и формирование результата в регистрах А. При вычитании мантисс с одинаковым знаком может возникнуть нарушение нормализации вправо, т. е. появление одного или нескольких нулей в старших разрядах мантиссы разности. Устранение нарушения нормализации выполняется путем сдвига мантиссы разности влево и уменьшения порядка результата рА на единицу при каждом сдвиге. Если при уменьшении порядка возникнет антипереполнение (при изменении порядка от минимально допустимого значения 0x00 к максимальному значению OxFF), выполняется выход из процедуры с установленным флагом С = 1 и возврат в головной модуль программы с неопределенным результатом. После устранения нарушения нормализации выполняется форматирование результата в регистрах А и выход из процедуры вычитания в основную программу.

Программа модуля вычитания, согласно описанному алгоритму, представлена в листинге программы 3.5. В ней, как и в предыдущем случае, использованы стандартные библиотечные процедуры для сдвига мантиссы, обмена операндов, преобразования форматов. Следует отметить, что использование команд с условным переходом, выполняемых по механизму относительной адресации, привело к необходимости выполнения длинных переходов за два шага: сначала на близко расположенную локальную метку QuitS, а затем с помощью команды безусловного перехода rjmp на метку выхода Quit.

Программа 3.5

;Программа 3.5 модуля вычитания чисел с плавающей точкой ;с одинаковым знаком выполняет вычитание из 1-го числа А,

;размещенного в регистрах (рА,тА), 2-го числа, размещенного ;в регистрах (рВ,МВ).

;Исходные операнды представлены в базовом формате. ;Результат операции возвращается в регистры 1-го числа ;(рА,тА) в базовом формате.

;Программный модуль размещается в файле flsub.asm и ;подключается к основной программе с помощью директивы ; .include "flsub.asm"

SubF: mov acc,pA          ;сравнение знаков чисел

eor асс,рВ brpl SubFl

Idi temp,0x80             ;при неравных знаках смена

add pB,temp               ;знака 2-го числа

rjmp AddF

SubFl: rcall cp_B_0       ;проверка В на 0

breq Quit

rcall cp_A_0              ;проверка A на 0

brne SubF2

rcall swapAB              ;обмен операндов

Idi temp,0x80

add pA,temp               ; со сменой знака результата

Quits: rjmp Quit

SubF2: bst pA, 7          ;сохранение знака в Т

rcall rec                 ;восстановление числа А

rcall swapAB              ;теперь в рА порядок 2-го числа

rcall rec                 ;восстановление числа В

mov асс,рВ                ;из порядка 1-го вычитаем

sub асс,рА                ; порядок 2-го

brne SubF3

ср mBH,mAH                ;при равенстве порядков

brne SubF3                ; сравниваем мантиссы

ср тВМ,тАМ

brne SubF3

ср mBL,mAL

brne SubF3

clr pA                    ;если числа равны,

clr mAH                   ; результат равен О

clr таМ clr mAL rjmp Quit

SubF3: brcc SubF4         ;переход, если 1-е число

; (оно в pB,mB) больше, rcall swapAB ; иначе обмен числами

brbc 6,s2                 ; и изменение знака в Т

rjmp s3 s2: set

rjmp SubF4 s3: clt

SubF4: mov acc,pB         ;снова вычитание порядков

sub acc,pA

breq SubF7             ;переход при одинаковых порядках

cpi асс,24 brmi SubF6

rcall swapAB           ;передача большего числа

; в (pA,mA) перед rjmp SubF9  ; форматированием результата

SubF6: rcall shift ;сдвиг мантиссы меньшего числа dec асс       ; в тА, пока

brne SubF6             ; разность порядков не равна О

;Вычитание мантисс и сохранение разности в тА

SubF7:     sub mBL,mAL

mov     mAL,mBL

sbc     mBM,mAM        ;вычитание с заемом

mov     mAM,mBM

sbc     mBH,mAH        ;вычитание с заемом

mov     mAH,mBH

mov     pA,pB          ;передача порядка результата в рА

SubF8: sbrc шАН,7         ;проверка нарушения нормализации

rjmp SubF9             ;переход, если нарушения нет,

dec рА                 ; иначе, не сдвигая мантиссу,

cpi рА,Oxff            ; проверяем антипереполнение,

sec                    ; заранее установив флаг в 1,

breq Quits            ;при антипереполнении выходим

; с флагом 1, иначе

Isl mAL                ; сдвигаем мантиссу шА влево го1 тАМ го1 шАН

с1с                    ; и сбрасываем флаг

rjmp SubFB             ;повторяем проверку

SubF9: rcall pack         ;форматируем результат

rjmp Quit              ;выход из процедуры вычитания

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

Таблица 3.5. Операции в дополнительных кодах

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

Умножение

Алгоритм умножения чисел с плавающей точкой С = А

Практическая часть

Задание 1. Открыв AVR Studio 4, создать проект. Загрузить программу 3.3 для проверки операций сложения и вычитания чисел с плавающей точкой. Привести ряд примеров с разными значениями операндов, воспользовавшись ручной загрузкой операндов в регистры окна НО. Подобрать операнды с равными и максимально различающимися порядками. Выполнить операции, фиксируя время их исполнения.

Задание 2. Создать проект и загрузить программу 3.6 для умножения чисел с плавающей точкой. Привести ряд примеров с разными значениями операндов. Оценить время выполнения операции умножения. Заменить программу умножения программой деления 3.7 и проверить ее работу.

Задания для самостоятельного программирования

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

2.   Для микроконтроллера ATmega8515 проверить работу операций умножения по их описанию, открыв файл помощи по AVR Ассемблеру, используя команды меню: Help;A VR Tools User Guide. В окне Html Help щелчком открыть А VR Assembler, выбрать Parts и затем ATmega8515. Подробное описание каждой из команд умножения можно найти в разделе А VR Assembler;Instructions.

3.  Рассмотреть операцию умножения дробных чисел на примерах. Проверить результаты с помощью симулятора AVR Studio 4.

4.  Написать процедуру сложения (вычитания) 2-байтовых операндов для проверки с помощью STK500. Сформировать признаки результата, как признаки 2-байтовой суммы (разности).

5.   Написать макрос для двоично-десятичной коррекции при сложении, равноценный команде DA А в системе команд микроконтроллеров MCS-51.

6.  Написать процедуру сложения (вычитания) двух 4-байтовых упакованных двоично-десятичных чисел.

nauchebe.net

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *