Red de conocimiento informático - Conocimiento informático - Aritmética de punto fijo desde punto flotante a punto fijo

Aritmética de punto fijo desde punto flotante a punto fijo

Al escribir algoritmos de simulación DSP, por conveniencia, generalmente se utilizan lenguajes de alto nivel (como el lenguaje C) para escribir programas de simulación. Las variables utilizadas en los programas generalmente incluyen tanto números enteros como números de coma flotante. Por ejemplo, la variable i en el programa del Ejemplo 3.1 es un número entero, pi es un número de punto flotante y hamwindow es una matriz de punto flotante.

Ejemplo de cálculo de ventana Hamming de 3,1256 puntos

inti;

floatpi=3.14159;

floathamwindow[256];

para (i=0;iQy, el valor de escala del resultado de suma/resta z es Qz, entonces

z=x+yÞ

=

Entonces, la suma de punto fijo se puede describir como:

intx,y,z;

longtemp;

temp= y>(Qx-Qz)), si Qx≥Qz

z=(int)(temp>2)=29491;

Porque el valor Q de z es 13, por lo que el valor de punto fijo z=29491 es el valor de punto flotante z=29491/8192=3,6.

Ejemplo 3.3 Resta de punto fijo

Supongamos que x=3.0, y=3.1, entonces el resultado de la operación de punto flotante es z=x-y=3.0-3.1=-0.1;

Qx=13, Qy=13, Qz=15, entonces la resta de punto fijo es:

x=24576; y=25295;

temp=25395;

temp=x-temp=24576-25395=-819;

Debido a que QxQy, el valor de escala del resultado de la suma z es Qz, entonces la suma de punto fijo es:

intx, y;

longtemp,z;

temp=y>(Qx-Qz), si Qx≥Qz

z =temp32767, por lo tanto

Qx=1, Qy=0, Qz=0, entonces la suma de punto fijo es:

x=30000;

<; p>temp=20000>1=35000;

p>

Debido a que el valor Q de z es 0, el valor de punto fijo z=35000 es un valor de punto flotante, donde z es un entero largo.

Cuando el resultado de la suma o suma excede el rango de representación de 16 bits, si el programador puede comprender esta situación de antemano y necesita garantizar la precisión de la operación, se debe mantener el resultado de 32 bits. Si el programa realiza operaciones basadas en 16 dígitos, si el número excede los 16 dígitos, se producirá un desbordamiento. Si no se toman las medidas adecuadas, el desbordamiento de datos puede provocar un grave deterioro de la precisión operativa. Los chips DSP de punto fijo generales están equipados con una función de protección contra desbordamiento. Cuando la función de protección contra desbordamiento es efectiva, una vez que se produce un desbordamiento, el resultado del ACC del acumulador es el valor máximo de saturación (el desbordamiento es 7FFFH, el desbordamiento es 8001H), evitando así. desbordamiento. Provocar un grave deterioro de la precisión.

3.2.2 Simulación de operación de multiplicación en punto fijo en lenguaje C

Supongamos que la expresión de la operación de multiplicación en punto flotante es:

floatx,y,z;

z=xy;

Supongamos que después de las estadísticas, el valor de escala de x es Qx, el valor de escala de y es Qy y el valor de escala del producto z es Qz, entonces

z=xyÞ

=

Entonces la multiplicación en representación de punto fijo es:

intx,y,z ;

longtemp;

temp=(long)x;

z=(temp×y)>>( Qx+Qy-Qz);

z=(temp×y)>>(Qx+Qy-Qz);

p>

Ejemplo 3.5 Multiplicación en punto fijo

Supongamos que x=18.4, y=36.8, entonces el valor de la operación de punto flotante es z=18.4×36.8=677.12;

Según la sección anterior, obtenemos Qx=10, Qy =9, Qz=5, entonces

x=18841; y=18841;

temp=18841L;

z=( 18841L*18841)>> (19-5)=354983281L>>14=21666;

Debido a que el valor de escala de z es 5, el punto fijo z=21666 es el punto flotante z=21666 /32=677.08 .

3.2.3 Simulación de operación de división en punto fijo en lenguaje C

Supongamos que la expresión de la operación de división en punto flotante es:

floatx,y,z;

z=x/y;

Supongamos que después de las estadísticas, el valor de escala del dividendo x es Qx, el valor de escala del divisor y es Qy y el valor de escala de el cociente z es Qz, entonces

z=x/yÞ

Entonces la división en representación de punto fijo es:

intx,y,z;

longtemp;

temp=(long)x;

z=(temp

consstintlength=180

voidfilter(intxin[],intxout[],intn,floath[]);

staticfloath[19]=

{0.01218354, -0.009012882,-0.02881839,-0.04743239,-0.04584568,

-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,

0.2289794, 0,1544655,0,06446265,-0,008692503,-0,04584568,

-0.04743239,-0.02881839 ,-0.009012882,0.01218354};

staticintx1[longitud+20];

voidfilter(intxin[],intxout[],intn ,floath[])

{

inti,j;

floatsum;

for(i=0;i

consstintlength=180;

voidfilter(intxin[],intxout[],intn,inth[]);

staticinth[19]={399,-296, -945,-1555,-1503,-285 ,2112,5061,7503,8450,

7503,5061,2112,-285,-1503,-1555,-945,-296,399};

staticintx1[longitud+20 ];

voidfilter(intxin[],intxout[],intn,inth[])

{

inti,j;

longsum;

for(i=0;i>15;

}

for(i= 0;i<(n-1);i++ )x1[n-i-2]=xin[length-i-1];

}

El programa principal es exactamente el mismo como el de coma flotante.