Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Эрни Каспер Программирование на языке Ассемблер...doc
Скачиваний:
141
Добавлен:
09.11.2019
Размер:
954.88 Кб
Скачать

4.4.Контроль точности при программировании арифметических операций

Читателям может показаться странным этот заголовок: ведь каждая из арифметических операций выполняется микроконтроллером с абсо­лютной точностью. Но абсолютная точность получается только в случае программирования вычислений с целыми числами ограниченной величины. В общем случае при неправильном программировании результат вычислений может иметь недопустимо большую погрешность или быть ошибочным. Первый случай относится к потере значимости, когда в отведенных для кодирования числа разрядах используются только самые младшие. Второй случай относится к переполнению разрядной сетки, когда число не поме­щается в отведенных для его кодирования разрядах. Поэтому при про­граммировании вычислений необходимо выбирать такой масштаб пред­ставления чисел, чтобы, с одной стороны, полнее использовать разрядную сетку, а с другой — не допустить ее переполнения. Если подбором масштабов не удается решить задачу приведения результатов измерений к целочисленному представлению, то можно использовать представление чисел с фиксированной запятой (в англоязычных странах для разделения целой и дробной частей числа используется точка). Притом позицию запятой можно фиксировать между разрядами какого-то байта или между байтами, представляющими число. Использование представления чисел с фиксированной запятой не означает какого-либо дополнительного кодирования. Нужно только внести эти сведения в документацию на программы (например, в комментарии) и учитывать при программирова­нии. При использовании представления чисел с фиксированной запятой перед сложением и вычитанием чисел с разными положениями запятой требуется сдвиг одного из операндов, а после умножения и деления почти всегда нужен сдвиг результата.

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

При использовании байтового формата абсолютная погрешность представления чисел не может быть меньше 0,4% от максимального значения для положительных чисел или 0,8% от максимального модуля для положительных и отрицательных чисел. Если не удается подобрать масштаб и/или требуются меньшие погрешности, то приходится представ­лять соответствующие числа несколькими байтами. При использовании двух байтов погрешность представления чисел может быть значительно снижена. Результаты вычислений будут содержать большие или меньшие погрешности в зависимости от погрешностей исходных чисел и от действий, произведенных над этими числами. Известно, что при сложении и вычитании абсолютная погрешность результата ограничена суммой абсолютных погрешностей операндов, а при умножении и делении относительная погрешность результата ограничена суммой относительных погрешностей операндов. Если модули операндов близки, то при вычитании для одина­ковых знаков операндов или сложении для разных знаков погрешность может превысить результат операции. Поэтому следует тщательно прове­рять расчетные формулы с точки зрения накопления погрешностей счета. Зачастую две математически равноценные формулы могут давать суще­ственно отличающиеся результаты, так как в дискретной математике переместительный и сочетательный законы выполняются не всегда.

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

RLC A ; удвоить делимое

ADD А, В ;прибавить делитель

RRC A ;разделить сумму на 2

DIV AB ;вычислить частное

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

Программисту следует помнить о возможности выхода результата за пределы представления чисел при заданном формате и способе кодирования. В ходе разработки программы такие возможности должны быть исключены, хотя от такого рода ошибок никто не застрахован. Здесь также возможны различные подходы. Например, можно на этапе отладки программы производить контроль результатов с выдачей диагностических сигналов на внешние порты микроконтроллера. Когда программа будет отлажена, то эти блоки контроля можно убрать. Но при использовании такого подхода трудно обеспечить всеобъемлющую проверку программы.

Для контроля выхода результата за пределы разрядной сетки можно использовать биты С и OV регистра PSW. Индикатором выхода за пределы разрядной сетки при сложении и вычитании положительных чисел является установка бита переноса в 1. Бит переполнения устанавливается в 1 в случае переполнения результата при сложении и вычитании чисел со знаком. Его можно также использовать для индикации деления на 0 и выхода произведения за пределы 255. Следует учитывать, что команды умножения и деления записывают в бит переноса 0, поэтому выход результата сложения или вычитания положительных чисел за пределы разрядной сетки нужно проверять сразу после выполнения команд сложения и вычитания. Бит переноса используется для арифметических операций с числами, которые представлены несколькими байтами. Он обеспечивает информационную связь между байтами, поэтому анализ содержимого битов переноса и переполнения нужно производить после вычисления старшего байта результата.

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

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

Рассмотрим простейший случай ограничения положительного значе­ния после выполнения операции сложения:

top: JC 100 рта ; числовая подстановка для максимума переход

; по выходу за пределы байта

CJNE A, #top, chg ; сравнение с максимальным значением

SJMP nch ; переход при максимальном значении

chg: JC nch ; переход, если ограничение не нужно

рта: MOV A, #top ; запись максимального значения

nch: NOP ; для записи метки

В результате выполнения приведенной последовательности команд результат сложения всегда будет находиться в заданных пределах. Если значение top не превышает 255, то приведенный блок может быть исполь­зован для ограничения не только после команды сложения, но и после команды прямого счета. Для ограничения результатов сложения и вычитания при использовании отрицательных чисел с записью в дополнительном коде программа немного усложняется. В этом случае значение top должно быть положительным, а значение bot — отрицательным.

top: .= 100 ; числовая подстановка для максимума

bot: .= -100 ; числовая подстановка для минимума

JNB 0V, chk ; переход по отсутствию переполнения

JB A.7 , рта ; переход по больше максимума

SJMP pmi ; переход по меньше минимума

Chk: JB A.7 , neg ; переход по отрицательному знаку

CJNE A, #top, chp ; проверка по максимуму

SJMP nch ; переход по равенству максимуму

chp: JC nch ; переход, если ограничение не нужно

рта; MOV A, #top ; запись максимального значения

SJMP nch ; на выход из блока

neg: CJNE A, #bot, chm ; проверка по минимуму

chm: JNC nch ; переход, если ограничение не

; нужно

pmi: MOV A, #bot ; запись минимума

nch: NOP ; для записи метки

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