fixed.cpp fixed.h long long prevod (double x, unsigned int posun) prevod double x unsigned int posun double double zprevod (long x, unsigned int posun) zprevod long x unsigned int posun long long nasob (int x, int y, unsigned int posun) nasob int x int y unsigned int posun int int deleni15 (int x, int y) deleni15 int x int y int int deleni (int x, int y, int posun1, int posun2, int scale, int posun_fin) deleni int x int y int posun1 int posun2 int scale int posun_fin /* Operacevpevneradovecarce 9.10.2005 */ #include"fixed.h" longprevod(doublex,unsignedintposun); //prevod"x"dosystemu"Qposun" doublezprevod(longx,unsignedintposun); //prevod"x"zesystemu"Qposun"doDOUBLE longnasob(intx,inty,unsignedintposun); //(x*y)>>posun intdeleni15(intx,inty); //(x*Q15/y)sesaturaci intdeleni(intx,inty,intposun1,intposun2,intscale,intposun_fin); //obecnedeleni:x_"Qposun1"*"Qscale"/y_"Qposun2"->"Q_posun_fin" longprevod(doublex,unsignedintposun) { longy,nasobic; intznamenko; nasobic=(long)1<<posun; if(x>=0)znamenko=1; elseznamenko=-1; y=(long)(x*nasobic+znamenko*0.5); returny; } doublezprevod(longx,unsignedintposun) { longnasobic; doubley; nasobic=(long)1<<posun; y=(double)x/nasobic; returny; } longnasob(intx,inty,unsignedintposun) { longz,zaokrouhl;//zaokrouhl...zaokrouhlovanivysledkupricteni0.5 intznamenko; if(posun>0) zaokrouhl=(long)1<<(posun-1); elsezaokrouhl=0; z=(long)x*y; if(z>=0)znamenko=1; elseznamenko=-1; z=(z+znamenko*zaokrouhl)>>posun; returnz; } intdeleni15(intx,inty)//deleniQ15/Q15sesaturaci { longz; z=(long)x*32768/y; if(z>32767)z=32767; if(z<-32768)z=-32768; return(int)z; } intdeleni(intx,inty,intposun1,intposun2,intscale,intposun_fin) /* x/y...podil posun1...posunx(scalefaktor) posun2...posuny scale...posunprideleni-pomocny posun_fin...system,vekteremmabytvysledek(scalefaktorvysledku) */ { intz; intbit_posun; longzz,scale_fakt,scale_fin; scale_fakt=(long)1<<scale; bit_posun=(posun1+scale-posun2)-posun_fin; zz=(long)x*scale_fakt/y; if(bit_posun>=0) zz=(int)(zz>>bit_posun); else {bit_posun*=-1; zz=(int)(zz<<bit_posun); } //Saturacevystupu if(zz>32767) z=32767; elseif(zz<-32768) z=-32768; else z=zz; returnz; }