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

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

Supongo que ya has leído el artículo de Wikipedia. secure.wikimedia.org/wikipedia/en/wiki/Cordic
por supuesto, pero ese artículo usa la función trigonométrica para explicar cómo funciona.
Esto es más un tipo de pregunta de desbordamiento de pila

Respuestas (2)

Este es un excelente artículo escrito por alguien en los foros de Parallax, llamado CORDIC For Dummies. Bien escrito y explica las cosas muy bien: http://forums.parallax.com/showthread.php?127241-CORDIC-for-dummies

Lo acabo de leer y estoy de acuerdo contigo, es un artículo excelente y muy claro.

Una división CORDIC se implementa usando la multiplicación CORDIC , 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 desplazadas de y . El valor desconocido para z se puede encontrar llevando x a cero 1 bit a la vez. Si el i- ésimo bit de x es distinto de cero, yi se desplaza hacia la derecha i bits y se suma al valor actual de z . Luego, el i -ésimo bit se elimina de x restando 2 -i de x . Si x es negativo, el i -ésimo bit en el formato de complemento a dos se eliminaría agregando 2 -i. En cualquier caso, cuando x se ha llevado a cero, se han examinado todos los bits y z contiene el producto con signo de xey correcto a B bits.

Este algoritmo es similar al algoritmo estándar de cambio y suma de multiplicación excepto por dos características importantes:

  1. Se utilizan desplazamientos aritméticos a la derecha en lugar de desplazamientos a la izquierda, lo que permite utilizar números con signo.
  2. Calcular el producto a B bits con el algoritmo CORDIC es equivalente a redondear el resultado del algoritmo estándar a los B bits más significativos.

La división z = x/yse encuentra...

... llevando x a cero usando versiones desplazadas a la derecha de y . Si el residual actual es positivo, se establece el i- ésimo bit en z . Asimismo, si el residual es negativo , se borra el i-ésimo bit en z .

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 números de punto flotante.

Dado que el sitio web del Dr. Dobb no tiene todos los detalles, puede leer el PDF en: siue.edu/~gengel/pdf/cordic.pdf
NOTA: si la parte sobre llevar una X a cero (en Z = X*Y) suena confusa: está agregando un múltiplo de Y a Z, para cada bit establecido en X. Siga agregando al total acumulado, hasta que se quede sin de bits en X.