Проектирование принципиальной схемы процессора для вычисления функции cos(x) методом «цифра за цифрой», страница 6


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


ПРИЛОЖЕНИЯ

Приложение 1. Программа на С++, реализующая алгоритм вычисления косинуса методом «цифра за цифрой».

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <iostream.h>

union

{

float f;

long int i;

} s;

long int ep;

long int fp;

long int sp;

void main()

{

onemore:

//---------------------------------------------float phi, y[16], x[16], k=0, K=1.646, teta[16], alpha=2, n=16;

int i=0;

float xcd, ycd;

float omega, c, buff;

//---------------------------------------------y[0]=0;

x[0]=1/K;

//---------------------------------------------clrscr();

cout<<"Enter angle : "; cin>>phi; teta[0] = phi*3.14/180.0;

//---------------------------------------------again:

i= (k-1)/(alpha-1)+1;

xcd=x[k]*pow(alpha,-i);

ycd=y[k]*pow(alpha,-i);

//---------------------------------------------if(teta[k]>=0)

{

buff = pow(alpha,(float)-i);

if(x[k]<0)omega=-1;

if(x[k]>0)omega=1;

if(x[k]==0)omega=0;

c=omega*atan(buff);

s.f=c;

fp=((1L<<23)-1)&s.i;

ep=255&(s.i>>23);

sp=((s.i&(1L<<31))!=0);

if(sp) printf("-"); else printf("+");

if(ep>0 && ep<255){

printf("1.");

for(int i=22; i>=0; i--) if((1L<<i)&fp) printf("1"); else printf("0");

printf("*2^(%d)\n\r", ep-127);

}

getch();

teta[k+1]=teta[k]-c;

y[k+1]=y[k]-xcd;

x[k+1]=x[k]+ycd;

cout<<"x = "<<x[k+1]<<"  omega = "<<omega<<"  i = "<<i<<"  c = "<<c<<endl;

}

//---------------------------------------------else

{

buff = pow(alpha,(float)-i);

if(x[k]<0)omega=-1;

if(x[k]>0)omega=1;

if(x[k]==0)omega=0;

c=omega*atan(buff);

s.f=c;

fp=((1L<<23)-1)&s.i;

ep=255&(s.i>>23);

sp=((s.i&(1L<<31))!=0);

if(sp) printf("-"); else printf("+");

if(ep>0 && ep<255){

printf("1.");

for(int i=22; i>=0; i--) if((1L<<i)&fp) printf("1"); else printf("0");

printf("*2^(%d)\n\r", ep-127);

}

//getch();

teta[k+1]=teta[k]+c;

y[k+1]=y[k]+xcd;

x[k+1]=x[k]-ycd;

cout<<"x = "<<x[k+1]<<"  omega = "<<omega<<"  i = "<<i<<"  c = "<<c<<endl;

}

//---------------------------------------------if(i==n)

{

cout<<endl<<"По методу #цифра за цифрой# : cos ("<<phi<<") = "<<x[k+1]<<endl;

cout<<"                   Реальный : cos ("<<phi<<") = "<< cos(phi*M_PI/180.0)<<endl;

cout<<endl<<"Press ESCAPE to quit"<<endl<<"Press ENTER to continue";

int k = getch();

if(k==27) exit(1);

goto onemore;

}

//---------------------------------------------else

{

k+=1; goto again;

}

//---------------------------------------------}


Приложение 2. Таблица прошивки ПЗУ, содержащие константы.