Выводы: В результате проделанной работы был реализован процессор, который вычисляет косинус, заданного угла. Исходя из этого хотелось бы отметить то, что с развитием информационной индустрии, когда вопрос встает об кодирование большого количества информации в малое количество времени (в данном случае я имею в виду видео информацию, так как для кодирования видео применяются преобразования Фурье, в основе которого лежат косинус и синус функции) алгоритмами, которые требуют меньше программных затрат, и уже переходящие на аппаратный уровень. Таким образом создавая аппаратную возможность вычисления элементарных функции, появляется возможность упростить, а что самое главное ускорить алгоритмы сжатия информации.
ПРИЛОЖЕНИЯ
Приложение 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. Таблица прошивки ПЗУ, содержащие константы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.