Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mcs51_1 / Пособие ч1.doc
Скачиваний:
52
Добавлен:
21.03.2016
Размер:
957.44 Кб
Скачать

3. Вычисления

Пример вычислений выражения y=x*(k+z)/0.1 в дробных.числах.

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

форматы c фиксированной точкой перед старшим десятичным разрядом. В следующем примере – масштаб m=102

char kk=25,zz=8; //реальные числа kk=0.25 и zz=0.08)

main()

{ char yy, xx=40; //реальное число xx=0,40

yy=xx*(kk+zz)/10; // yy=132 в масштабе m2=104

с абсолютной погрешностью 10-4

значение дробное 0,0132

}

Для упрощения вычислений целесообразно проверить возможность использование двоичных (2n) масштабов - в данном случае 28

Float kk=0.25, zz=0.08, xx=0,40;

char kk=0x100*kk, zz=0x100*zz; //kk=0x40, zz=0x14

main()

{ char yy, xx=0x100*xx; //xx=0x66

yy=xx*(kk+zz)/0x1a //0x100*0.1=0x1a

// yy=0x84 в масштабе 216

или 132 в масштабе 104

значение дробное 0,0132

}

Здесь вычисления усложняются при вводе с плавающей точкой.

Однако если входные данные подготовлены в виде масштабируемых целых,то

ее можно упростить

char kk=0x40, zz=0x14;

main()

{ char yy, xx=0x66;

y=((xx*(kk+zz)) >>8)*0xA

// yy=0x84 в масштабе 28

или 132 в масштабе 104

значение дробное 0,0132

}

Если рассмотреть ассемблерный вариант программы, то он будет проще

в несколько раз

mov a,kk

add a,zz ;kk+zz

mov b,xx

mul ab ;xx*(kk+zz) в масштабе 216

mov a,#0xA

mul ab ;yy в масштабе 28

mov yy

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

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

Вычисления с плавающей точкой выполняются только в Си.

Вычисления с фиксированной точкой для целых с оптимальным масштабом в Си и Макроассемблере.

3.1. Вычисление функции с плавающей точкой.

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

ЭВМ в широком диапазоне с автоматическим изменением масштаба, с постояннной отнсительной погрещностью и переменной абсолютной .

Однако FP-формат не всегда приемлем в вычислениях и проектировании ЭВМ:

  1. сложные алгоритмы преобразования – высокая сложность аппаратуры и большие затраты времени при вычислениях

  2. постоянная относительная погрешность, зависящая только от разрядности мантиссы ∂ = 2(-n) (двоичная (n)-разрядная мантисса, округление усечением). В макро-микро-мире абсолютная погрешность при 24-битовой мантиссе может изменяться в недопустимом интервале

[2(-32)2(-24) =2(-56) <= ∆ <=[2322(-24) <= 28 ]

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

Пример.

Используя библиотечную функцию из библиотеки math.h языка С51, вычислить значения sin(x) в диапазоне аргумента 0-360о. При компиляции в Кейл записать параметры программы – объем требуемой памяти данных и объем программы.

C использованием Логического Анализатора получить временные диаграммы и измерить среднее время вычисления функции.

Схема вывода значений функции через порт. - псевдо Цифро-аналоговое графическое преобразование выполняет Анализатор. В окне Анализатора как на экране цифрового осциллографа могут быть измерены временные параметры графика функции и абсолютные значения в масштабе 28

Р3

Sin(x)

ЦАП

Окно Анализатора

Рис.2.7. Схема работы Анализатора.

При выводе через порт P3 учитывается, что значение должно быть целым, положительным и не более 28.

#include <reg51.h>

#include <math.h>

float x;

unsigned char xdata y[100],i;

main()

{

/* цикл формирования значений в массиве

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

*/

i=0;

for(x=0; x<6.28 ;x+=0.0628)

y[i++]=P3=sin(x)*100+100; //масштабное преобразование переводит дробное в целое с точностью 2 знака после запятой и смещает в положительную область значений

}

Для точного измерения собственно времени вычисления sin(x) без учета промежуточных преобразований целых в float и обратно использовать вывод признаков через порт P2.

Например, вычислить sin(30°) и измерить время вычисления .

Командой LA P2 значение в Анализатор передается через порт P2

Реальное время вычислений контролируется Симулятором и синхронизировано частотой работы компьютера.

Соседние файлы в папке mcs51_1