КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Вычисление функции с плавающей точкой
Вычисления Пример вычислений выражения 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 фиксированной точкой в форматах целых с масштабированием и дробных без масштабирования, а также показать эффективность выбора двоичных масштабов.
Вычисления с плавающей точкой выполняются только в Си. Вычисления с фиксированной точкой для целых с оптимальным масштабом в Си и Макроассемблере.
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
Рис.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 Реальное время вычислений контролируется Симулятором и синхронизировано частотой работы компьютера.
Дата добавления: 2014-12-27; Просмотров: 476; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |