Referencias con explicaciones de cómo funciona el algoritmo CORDIC para la división

2

¿Alguien sabe alguna referencia disponible para saber cómo funciona el algoritmo CORDIC para implementar una división?

    
pregunta Peterstone

2 respuestas

5

Este es un excelente artículo escrito por alguien en los foros de Parallax, llamado CORDIC For Dummies. Bien escrito y explica bien las cosas: enlace

    
respondido por el gallamine
2

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:

     
  1. Se usan desplazamientos a la derecha aritméticos en lugar de desplazamientos a la izquierda, lo que permite usar números con signo.
  2.   
  3. 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.
  4.   

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.

    
respondido por el tyblu

Lea otras preguntas en las etiquetas