¿Alguien sabe alguna referencia disponible para saber cómo funciona el algoritmo CORDIC para implementar una división?
¿Alguien sabe alguna referencia disponible para saber cómo funciona el algoritmo CORDIC para implementar una división?
Una división CORDICA se implementa utilizando multiplicación CORDICA , reorganizando de la siguiente manera: [fuente]
c = a/b
a - c*b = 0
Para la multiplicación z = x*y
:
z se compone de versiones modificadas de y . El valor desconocido para z , se puede encontrar al conducir x a cero 1 bit a la vez. Si el bit ith de x no es cero, y i se desplaza a la derecha en i bits y se agrega al valor actual de z . El bit ith luego se elimina de x restando 2 -i de x . Si x es negativo, el bit ith en el formato de complemento de dos se eliminará agregando 2-i . En cualquier caso, cuando x se redujo a cero, se examinaron todos los bits y z contiene el producto firmado. de x y y correcto a B bits.
Este algoritmo es similar al algoritmo estándar de desplazamiento y adición, excepto por dos características importantes:
- Se usan desplazamientos a la derecha aritméticos en lugar de desplazamientos a la izquierda, lo que permite usar números con signo.
- Calcular el producto a B bits con el algoritmo CORDIC es equivalente a redondear el resultado del algoritmo estándar a los bits B más significativos.
Se encuentra la división z = x/y
...
... conduciendo x a cero usando versiones con desplazamiento a la derecha de y . Si el residual actual es positivo, el bit ith en z se establece . Del mismo modo, si el residuo es negativo, el bit ith en z se borra.
divide_4q(x,y){ for (i=1; i=<B; i++){ if (x > 0) if (y > 0) x = x - y*2^(-i); z = z + 2^(-i); else x = x + y*2^(-i); z = z - 2^(-i); else if (y > 0) x = x + y*2^(-i); z = z - 2^(-i); else x = x - y*2^(-i); z = z + 2^(-i); } return(z) }
Tendrá que hacer algunas modificaciones para usar los números de punto flotante.
Lea otras preguntas en las etiquetas how-does-it-work reference cordic