stringtranslate.com

CORDICO

CORDIC ( computadora digital de rotación de coordenadas ), algoritmo de Volder , método dígito por dígito , CORDIC circular ( Jack E. Volder ), [1] [2] CORDIC lineal , CORDIC hiperbólico (John Stephen Walther), [3] [4] y CORDIC hiperbólico generalizado ( GH CORDIC ) (Yuanyong Luo et al.), [5] [6] es un algoritmo simple y eficiente para calcular funciones trigonométricas , funciones hiperbólicas , raíces cuadradas , multiplicaciones , divisiones y exponenciales y logaritmos con base arbitraria. , normalmente convergendo con un dígito (o bit) por iteración. Por lo tanto, CORDIC también es un ejemplo de algoritmos dígito por dígito . CORDIC y los métodos estrechamente relacionados conocidos como pseudomultiplicación y pseudodivisión o combinación de factores se usan comúnmente cuando no hay un multiplicador de hardware disponible (por ejemplo, en microcontroladores simples y conjuntos de puertas programables en campo o FPGA), ya que las únicas operaciones que requieren son adiciones . restas , bitshift y tablas de búsqueda . Como tales, todos pertenecen a la clase de algoritmos de desplazamiento y suma . En informática, CORDIC se utiliza a menudo para implementar aritmética de punto flotante cuando la plataforma de destino carece de hardware por razones de costo o espacio.

Historia

Henry Briggs publicó técnicas matemáticas similares ya en 1624 [7] [8] y Robert Flower en 1771, [9] pero CORDIC está mejor optimizado para CPU de estado finito de baja complejidad.

CORDIC fue concebido en 1956 [10] [11] por Jack E. Volder en el departamento de aeroelectrónica de Convair por la necesidad de reemplazar el resolver analógico en la computadora de navegación del bombardero B-58 con un sistema digital en tiempo real más preciso y rápido. solución. [11] Por lo tanto, a CORDIC a veces se le conoce como un solucionador digital. [12] [13]

En su investigación, Volder se inspiró en una fórmula de la edición de 1946 del CRC Handbook of Chemistry and Physics : [11]

donde es tal que , y .

Su investigación condujo a un informe técnico interno que proponía el algoritmo CORDIC para resolver funciones seno y coseno y una computadora prototípica que lo implementaba. [10] [11] El informe también analiza la posibilidad de calcular la rotación de coordenadas hiperbólicas , logaritmos y funciones exponenciales con algoritmos CORDIC modificados. [10] [11] En este momento también se concibió la utilización de CORDIC para la multiplicación y la división . [11] Basado en el principio CORDIC, Dan H. Daggett, un colega de Volder en Convair, desarrolló algoritmos de conversión entre binario y decimal codificado en binario (BCD). [11] [14]

En 1958, Convair finalmente comenzó a construir un sistema de demostración para resolver problemas de reparación de radar , denominado CORDIC I , completado en 1960 sin Volder, que ya había abandonado la empresa. [1] [11] Daggett y Harry Schuss construyeron y probaron modelos CORDIC II A (estacionarios) y B (aerotransportados) más universales en 1962. [11] [15]

El algoritmo CORDIC de Volder se describió por primera vez en público en 1959, [1] [2] [11] [13] [16], lo que provocó que empresas como Martin-Orlando , Computer Control , Litton , Kearfott , Lear lo incorporaran a las computadoras de navegación. -Siegler , Sperry , Raytheon y Collins Radio . [11]

Volder se asoció con Malcolm McMillan para construir Athena , una calculadora de escritorio de punto fijo que utiliza su algoritmo binario CORDIC. [17] El diseño se presentó a Hewlett-Packard en junio de 1965, pero no fue aceptado. [17] Aún así, McMillan presentó a David S. Cochran (HP) el algoritmo de Volder y cuando Cochran conoció más tarde a Volder, lo refirió a un enfoque similar que John E. Meggitt (IBM [18] ) había propuesto como pseudomultiplicación y pseudodivisión. en 1961. [18] [19] El método de Meggitt también sugirió el uso de base 10 [18] en lugar de base 2 , como lo utiliza el CORDIC de Volder hasta ahora. Estos esfuerzos condujeron a la implementación de lógica ROMable de un prototipo de máquina decimal CORDIC dentro de Hewlett-Packard en 1966, [20] [19] construida y derivada conceptualmente de la prototipo Green Machine de Thomas E. Osborne, una máquina de punto flotante de cuatro funciones. calculadora de escritorio que había completado en lógica DTL [17] en diciembre de 1964. [21] Este proyecto resultó en la demostración pública de la primera calculadora de escritorio de Hewlett-Packard con funciones científicas, la HP 9100A en marzo de 1968, y la producción en serie comenzó más tarde ese año. . [17] [21] [22] [23]

Cuando Wang Laboratories descubrió que el HP 9100A utilizaba un enfoque similar al método de combinación de factores en sus anteriores calculadoras de escritorio LOCI-1 [24] (septiembre de 1964) y LOCI-2 (enero de 1965) [25] [26] Logarithmic Computing Instrument , [27] acusaron sin éxito a Hewlett-Packard de infracción de una de las patentes de An Wang en 1968. [19] [28] [29] [30]

John Stephen Walther de Hewlett-Packard generalizó el algoritmo en el algoritmo CORDIC unificado en 1971, permitiéndole calcular funciones hiperbólicas , exponenciales naturales , logaritmos naturales , multiplicaciones , divisiones y raíces cuadradas . [31] [3] [4] [32] Las subrutinas CORDIC para funciones trigonométricas e hiperbólicas podrían compartir la mayor parte de su código. [28] Este desarrollo dio como resultado la primera calculadora científica de mano , la HP-35 en 1972. [28] [33] [34] [35] [36] [37] Basado en CORDIC hiperbólico, Yuanyong Luo et al. propuso además un CORDIC hiperbólico generalizado (GH CORDIC) para calcular directamente logaritmos y exponenciales con una base fija arbitraria en 2019. [5] [6] [38] [39] [40] Teóricamente, CORDIC hiperbólico es un caso especial de GH CORDIC . [5]

Originalmente, CORDIC se implementó únicamente usando el sistema numérico binario y, a pesar de que Meggitt sugirió el uso del sistema decimal para su método de pseudomultiplicación, el CORDIC decimal continuó siendo prácticamente desconocido durante varios años más, por lo que Hermann Schmid y Anthony Bogacki todavía sugirieron lo consideró una novedad en 1973 [16] [13] [41] [42] [43] y sólo más tarde se descubrió que Hewlett-Packard ya lo había implementado en 1966. [11] [13] [20] [28]

Decimal CORDIC se utilizó ampliamente en calculadoras de bolsillo , [13] la mayoría de las cuales funcionan en decimal codificado en binario (BCD) en lugar de binario. Este cambio en el formato de entrada y salida no alteró los algoritmos de cálculo centrales de CORDIC. CORDIC es especialmente adecuado para calculadoras portátiles, en las que el bajo coste (y, por tanto, el bajo número de puertas de chip) es mucho más importante que la velocidad.

CORDIC se ha implementado en STM32G4 basado en ARM , Intel 8087 , [43] [44] [45] [46] [47] 80287 , [47] [48] 80387 [47] [48] hasta 80486 [43 ] serie de coprocesadores, así como en Motorola 68881 [43] [44] y 68882 para algunos tipos de instrucciones de punto flotante, principalmente como una forma de reducir el número de puertas (y la complejidad) del subsistema FPU .

Aplicaciones

CORDIC utiliza operaciones simples de desplazamiento y suma para varias tareas informáticas, como el cálculo de funciones trigonométricas, hiperbólicas y logarítmicas, multiplicaciones reales y complejas, división, cálculo de raíces cuadradas, solución de sistemas lineales, estimación de valores propios , descomposición de valores singulares , factorización QR y muchos otros. Como consecuencia, CORDIC se ha utilizado para aplicaciones en diversas áreas, como procesamiento de señales e imágenes , sistemas de comunicación , robótica y gráficos 3D, además de la computación científica y técnica general. [49] [50]

Hardware

El algoritmo se utilizó en el sistema de navegación del vehículo lunar itinerante del programa Apollo para calcular el rumbo y el alcance, o distancia desde el módulo lunar . [51] [52] CORDIC se utilizó para implementar el coprocesador matemático Intel 8087 en 1980, evitando la necesidad de implementar la multiplicación de hardware. [53]

CORDIC es generalmente más rápido que otros enfoques cuando no se dispone de un multiplicador de hardware (por ejemplo, un microcontrolador) o cuando se debe minimizar el número de puertas necesarias para implementar las funciones que admite (por ejemplo, en una FPGA o ASIC ). De hecho, CORDIC es una IP estándar en aplicaciones de desarrollo FPGA como Vivado para Xilinx, mientras que una implementación en serie de potencias no se debe a la especificidad de dicha IP, es decir, CORDIC puede calcular muchas funciones diferentes (propósito general) mientras que una El multiplicador de hardware configurado para ejecutar implementaciones de series de potencias solo puede calcular la función para la que fue diseñado.

Por otro lado, cuando se dispone de un multiplicador de hardware ( por ejemplo , en un microprocesador DSP ), los métodos de búsqueda de tablas y las series de potencia son generalmente más rápidos que CORDIC. En los últimos años, el algoritmo CORDIC se ha utilizado ampliamente para diversas aplicaciones biomédicas, especialmente en implementaciones de FPGA. [ cita necesaria ]

La serie STM32G4 y cierta serie de MCU STM32H7 implementan un módulo CORDIC para acelerar los cálculos en diversas aplicaciones de señales mixtas, como gráficos para interfaz hombre-máquina y control de motores orientado al campo. Si bien no es tan rápido como una aproximación de series de potencias, CORDIC es de hecho más rápido que las implementaciones basadas en tablas de interpolación, como las proporcionadas por las bibliotecas estándar ARM CMSIS y C. [54] Aunque los resultados pueden ser un poco menos precisos ya que los módulos CORDIC proporcionados solo logran 20 bits de precisión en el resultado. Por ejemplo, la mayor parte de la diferencia de rendimiento en comparación con la implementación ARM se debe a la sobrecarga del algoritmo de interpolación, que logra una precisión de punto flotante total (24 bits) y probablemente puede lograr un error relativo con esa precisión. [55] Otro beneficio es que el módulo CORDIC es un coprocesador y puede ejecutarse en paralelo con otras tareas de la CPU.

El problema con el uso de series de Taylor es que, si bien proporcionan un error absoluto pequeño, no presentan un error relativo que se comporta bien. [56] Se pueden utilizar otros medios de aproximación polinomial, como la optimización minimax , para controlar ambos tipos de error.

Software

Muchos sistemas antiguos con CPU de sólo números enteros han implementado CORDIC en diversos grados como parte de sus bibliotecas de punto flotante IEEE . Como la mayoría de las CPU modernas de uso general tienen registros de punto flotante con operaciones comunes como sumar, restar, multiplicar, dividir, seno, coseno, raíz cuadrada, log 10 , registro natural, la necesidad de implementar CORDIC en ellas con software es casi nula. -existente. Sólo los microcontroladores o aplicaciones de software especiales de seguridad y de tiempo limitado deberían considerar el uso de CORDIC.

Modos de operacion

Modo de rotación

CORDIC se puede utilizar para calcular varias funciones diferentes. Esta explicación muestra cómo usar CORDIC en modo de rotación para calcular el seno y el coseno de un ángulo, asumiendo que el ángulo deseado se da en radianes y se representa en un formato de punto fijo. Para determinar el seno o coseno de un ángulo , se debe encontrar la coordenada y o x de un punto en el círculo unitario correspondiente al ángulo deseado. Usando CORDIC, se comenzaría con el vector :

Una ilustración del algoritmo CORDIC en progreso

En la primera iteración, este vector se gira 45° en sentido antihorario para obtener el vector . Iteraciones sucesivas rotan el vector en una u otra dirección mediante pasos de disminución de tamaño, hasta lograr el ángulo deseado. Cada ángulo de paso es para .

Más formalmente, cada iteración calcula una rotación, que se realiza multiplicando el vector por la matriz de rotación :

La matriz de rotación está dada por

Usando la identidad trigonométrica :

El factor coseno se puede eliminar para dar:

La expresión para el vector rotado se convierte entonces en:

donde y son los componentes de . Establecer el ángulo para cada iteración de modo que aún produzca una serie que converja a todos los valores de salida posibles. Por lo tanto, la multiplicación por la tangente se puede sustituir por una división por una potencia de dos, lo que se realiza de manera eficiente en el hardware de una computadora digital mediante un desplazamiento de bits . La expresión entonces queda:

y se utiliza para determinar la dirección de rotación: si el ángulo es positivo, entonces es +1, en caso contrario es −1.

Se puede utilizar la siguiente identidad trigonométrica para reemplazar el coseno:

,

dando este multiplicador para cada iteración:

Luego, los factores se pueden sacar del proceso iterativo y aplicarlos todos a la vez con un factor de escala :

que se calcula de antemano y se almacena en una tabla o como una constante única, si el número de iteraciones es fijo. Esta corrección también podría realizarse con antelación, escalando y guardando así una multiplicación. Además, se puede observar que [43]

para permitir una mayor reducción de la complejidad del algoritmo. Algunas aplicaciones pueden evitar la corrección por completo, lo que resulta en una ganancia de procesamiento : [57]

Después de un número suficiente de iteraciones, el ángulo del vector estará cerca del ángulo deseado . Para la mayoría de los propósitos comunes, 40 iteraciones ( n  = 40) son suficientes para obtener el resultado correcto hasta el décimo decimal.

La única tarea que queda es determinar si la rotación debe ser en el sentido de las agujas del reloj o en el sentido contrario a las agujas del reloj en cada iteración (eligiendo el valor de ). Esto se hace manteniendo un registro de cuánto se giró el ángulo en cada iteración y restándolo del ángulo deseado; luego, para acercarse al ángulo deseado , si es positivo, la rotación es en el sentido de las agujas del reloj, en caso contrario es negativo y la rotación es en el sentido contrario a las agujas del reloj:

Los valores de también deben calcularse previamente y almacenarse. Para ángulos pequeños se puede aproximar para reducir el tamaño de la mesa.

Como se puede ver en la ilustración anterior, el seno del ángulo es la coordenada y del vector final, mientras que la coordenada x es el valor del coseno.

Modo de vectorización

El algoritmo de modo de rotación descrito anteriormente puede rotar cualquier vector (no solo un vector unitario alineado a lo largo del eje x ) en un ángulo entre −90° y +90°. Las decisiones sobre el sentido de la rotación dependen de que sea positiva o negativa.

El modo de operación de vectorización requiere una ligera modificación del algoritmo. Comienza con un vector cuya coordenada x es positiva mientras que la coordenada y es arbitraria. Las rotaciones sucesivas tienen el objetivo de rotar el vector hacia el eje x (y por lo tanto reducir la coordenada y a cero). En cada paso, el valor de y determina la dirección de rotación. El valor final de contiene el ángulo total de rotación. El valor final de x será la magnitud del vector original escalado por K. Entonces, un uso obvio del modo de vectorización es la transformación de coordenadas rectangulares a polares.

Implementación

En Java, la clase Math tiene un scalb(double x,int scale)método para realizar dicho cambio, [58] C tiene la función ldexp , [59] y la clase de procesadores x86 tiene la fscaleoperación de punto flotante. [60]

Ejemplo de software (Python)

de  matemáticas  importar  atan2 ,  sqrt ,  sin ,  cos ,  radianesITERS  =  16theta_table  =  [ atan2 ( 1 ,  2 ** i )  para  i  en el  rango ( ITERS )]def  calcular_K ( n ): """ Calcule K(n) para n = ITERS. Esto también podría ser almacenado como una constante explícita si ITERS anterior es fijo. """ k  =  1,0 para  i  en  el rango ( n ): k  *=  1  /  raíz cuadrada ( 1  +  2  **  ( - 2  *  i )) volver  kdef  CORDIC ( alfa ,  n ): K_n  =  calcular_K ( n ) theta  =  0,0 x  =  1,0 y  =  0,0 P2i  =  1  # Esto será 2**(-i) en el bucle siguiente para  arc_tangent  en  theta_table : sigma  =  + 1  si  theta  <  alfa  en caso contrario  - 1 theta  +=  sigma  *  arco_tangente x ,  y  =  x  -  sigma  *  y  *  P2i ,  sigma  *  P2i  *  x  +  y P2i  /=  2 devolver  x  *  K_n ,  y  *  K_nsi  __nombre__  ==  "__principal__" : # Imprima una tabla de senos y cosenos calculados, de -90° a +90°, en pasos de 15°, # comparando con las rutinas matemáticas disponibles. print ( " x sin(x) dif. seno cos(x) dif. coseno " ) para  x  en  el rango ( - 90 ,  91 ,  15 ): cos_x ,  sin_x  =  CORDIC ( radianes ( x ),  ITERS ) imprimir ( f " { x : +05.1f } ° { sin_x : +.8f } ( { sin_x - sin ( radianes ( x ) ) : +.8f } ) { cos_x : +.8f } ( { cos_x - cos ( radianes ( x )) : +.8f } )" )

Producción

$ python  cordic.py  x sin(x) diff. seno cos(x) dif. coseno -90,0° -1,00000000 (+0,00000000) -0,00001759 (-0,00001759) -75,0° -0,96592181 (+0,00000402) +0,25883404 (+0,00001499) -60,0° 01812 (+0,00000729) +0,50001262 (+0,00001262) -45,0° - 0,70711776 (-0,00001098) +0,70709580 (-0,00001098) -30,0° -0,50001262 (-0,00001262) +0,86601812 (-0,00000729) -15,0° -0,25883404 (-0. 00001499) +0,96592181 (-0,00000402) +00,0° +0,00001759 (+0,00001759) +1,00000000 (-0,00000000) +15,0° +0,25883404 (+0,00001499) +0,96592181 (-0,00000402) +30,0° +0,50001262 (+0,00001262) +0,86601812 (-0. 00000729) +45,0° +0,70709580 (-0,00001098) +0,70711776 (+0,00001098 ) +60,0° +0,86601812 (-0,00000729) +0,50001262 (+0,00001262) +75,0° +0,96592181 (-0,00000402) +0,25883404 (+0,00001499) +90,0° +1,0000 0000 (-0,00000000) -0,00001759 (-0,00001759)

Ejemplo de hardware

El número de puertas lógicas para la implementación de un CORDIC es aproximadamente comparable al número necesario para un multiplicador, ya que ambos requieren combinaciones de cambios y adiciones. La elección de una implementación basada en multiplicadores o CORDIC dependerá del contexto. La multiplicación de dos números complejos representados por sus componentes reales e imaginarios (coordenadas rectangulares), por ejemplo, requiere 4 multiplicaciones, pero podría realizarse con un solo CORDIC operando sobre números complejos representados por sus coordenadas polares, especialmente si la magnitud de los números no es relevante (multiplicar un vector complejo por un vector en el círculo unitario en realidad equivale a una rotación). Los CORDIC se utilizan a menudo en circuitos de telecomunicaciones, como convertidores descendentes digitales .

Iteraciones dobles CORDIC

En dos de las publicaciones de Vladimir Baykov, [61] [62] se propuso utilizar el método de las dobles iteraciones para la implementación de las funciones: arcoseno, arcocoseno, logaritmo natural, función exponencial, así como para el cálculo de la hiperbólica. funciones. El método de doble iteración consiste en que a diferencia del método CORDIC clásico, donde el valor del paso de iteración cambia cada vez, es decir, en cada iteración, en el método de doble iteración el valor del paso de iteración se repite dos veces y cambia sólo en una iteración. De ahí apareció la designación para el indicador de grado para iteraciones dobles: . Mientras que con iteraciones ordinarias: . El método de doble iteración garantiza la convergencia del método en todo el rango válido de cambios de argumentos.

La generalización de los problemas de convergencia CORDIC para el sistema numérico posicional arbitrario con base mostró [63] que para las funciones seno, coseno, arcotangente, basta con realizar iteraciones para cada valor de i (i = 0 o 1 an, donde n es el número de dígitos), es decir, para cada dígito del resultado. Para el logaritmo natural, exponencial, seno hiperbólico, coseno y arcotangente, se deben realizar iteraciones para cada valor . Para las funciones arcoseno y arcocoseno, se deben realizar dos iteraciones para cada dígito numérico, es decir, para cada valor de . [63]

Para funciones seno y arcoseno hiperbólicas inversas, el número de iteraciones será para cada , es decir, para cada dígito del resultado.

Algoritmos relacionados

CORDIC es parte de la clase de algoritmos de "desplazamiento y suma" , al igual que los algoritmos de logaritmos y exponenciales derivados del trabajo de Henry Briggs. Otro algoritmo de desplazamiento y suma que se puede utilizar para calcular muchas funciones elementales es el algoritmo BKM , que es una generalización del logaritmo y los algoritmos exponenciales al plano complejo. Por ejemplo, BKM se puede utilizar para calcular el seno y el coseno de un ángulo real (en radianes) calculando el exponencial de , que es . El algoritmo BKM es ligeramente más complejo que CORDIC, pero tiene la ventaja de que no necesita un factor de escala ( K ).

Ver también

Referencias

  1. ^ abc Volder, Jack E. (3 de marzo de 1959). "La técnica informática CORDIC" (PDF) . Actas de la Western Joint Computer Conference (WJCC) (presentación). San Francisco, California, EE.UU.: Comité Nacional Conjunto de Informática (NJCC): 257–261 . Consultado el 2 de enero de 2016 .
  2. ^ ab Volder, Jack E. (25 de mayo de 1959). "La técnica de computación trigonométrica CORDIC" (PDF) . Transacciones IRE en Computadoras Electrónicas . 8 (3). The Institute of Radio Engineers, Inc. (IRE) (publicado en septiembre de 1959): 330–334 (reimpresión: 226–230). CE-8(3):330–334. Archivado desde el original (PDF) el 12 de junio de 2021 . Consultado el 1 de enero de 2016 .
  3. ^ ab Walther, John Stephen (mayo de 1971). Escrito en Palo Alto, California, Estados Unidos. "Un algoritmo unificado para funciones elementales" (PDF) . Actas de la conferencia informática conjunta de primavera . 38 . Atlantic City, Nueva Jersey, Estados Unidos: Hewlett-Packard Company : 379–385. Archivado desde el original (PDF) el 12 de junio de 2021 . Consultado el 1 de enero de 2016 a través de la Federación Estadounidense de Sociedades de Procesamiento de Información (AFIPS).
  4. ^ ab Walther, John Stephen (junio de 2000). "La historia de CORDIC unificado". La revista de procesamiento de señales VLSI . 25 (2 (Número especial sobre CORDIC)). Hingham, MA, EE.UU.: Kluwer Academic Publishers : 107–112. doi :10.1023/A:1008162721424. ISSN  0922-5773. S2CID  26922158.
  5. ^ abc Luo, Yuanyong; Wang, Yuxuan; Ja, Yajun; Wang, Zhongfeng; Chen, Siyuan; Pan, Hongbing (septiembre de 2019). "CORDIC hiperbólico generalizado y su cálculo logarítmico y exponencial con base fija arbitraria". Transacciones IEEE en sistemas de integración a muy gran escala (VLSI) . 27 (9): 2156–2169. doi :10.1109/TVLSI.2019.2919557. S2CID  196171166.
  6. ^ ab Luo, Yuanyong; Wang, Yuxuan; Ja, Yajun; Wang, Zhongfeng; Chen, Siyuan; Pan, Hongbing (septiembre de 2019). "Correcciones al" CORDIC hiperbólico generalizado y su cálculo logarítmico y exponencial con base fija arbitraria "". Transacciones IEEE en sistemas de integración a muy gran escala (VLSI) . 27 (9): 2222. doi :10.1109/TVLSI.2019.2932174. S2CID  201711001.
  7. ^ Briggs, Henry (1624). Aritmética Logarítmica . Londres.(Traducción: [1] Archivado el 4 de marzo de 2016 en Wayback Machine )
  8. ^ Laporte, Jacques (2014) [2005]. "Henry Briggs y el HP 35". París, Francia. Archivado desde el original el 9 de marzo de 2015 . Consultado el 2 de enero de 2016 .[2] Archivado el 10 de agosto de 2020 en Wayback Machine.
  9. ^ Flor, Robert (1771). La raíz. Una nueva forma de hacer logaritmos. Londres: J. Beecroft . Consultado el 2 de enero de 2016 .
  10. ^ abc Volder, Jack E. (15 de junio de 1956), Algoritmos de cálculo binario para rotación de coordenadas y generación de funciones (informe interno), Convair , grupo de aeroelectrónica, IAR-1.148
  11. ^ abcdefghijkl Volder, Jack E. (junio de 2000). "El nacimiento de CORDIC" (PDF) . Revista de procesamiento de señales VLSI . 25 (2 (Número especial sobre CORDIC)). Hingham, MA, EE.UU.: Kluwer Academic Publishers : 101–105. doi :10.1023/A:1008110704586. ISSN  0922-5773. S2CID  112881. Archivado desde el original (PDF) el 4 de marzo de 2016 . Consultado el 2 de enero de 2016 .
  12. ^ Perle, Michael D. (junio de 1971), "La técnica CORDIC reduce la búsqueda de funciones trigonométricas", Computer Design , Boston, MA, EE. UU.: Computer Design Publishing Corp.: 72–78(NB. Algunas fuentes se refieren erróneamente a esto como PZ Perle o en Component Design ).
  13. ^ abcde Schmid, Hermann (1983) [1974]. Computación decimal (1 (reimpresión) ed.). Malabar, Florida, Estados Unidos: Robert E. Krieger Publishing Company. págs. 162, 165–176, 181–193. ISBN 0-89874-318-4. Consultado el 3 de enero de 2016 .(NB. Al menos algunos lotes de esta edición de reimpresión eran errores de impresión con páginas 115 a 146 defectuosas).
  14. ^ Daggett, Dan H. (septiembre de 1959). "Conversiones decimal-binario en CORDIC". Transacciones IRE en Computadoras Electrónicas . 8 (3). Instituto de Ingenieros de Radio, Inc. (IRE): 335–339. doi :10.1109/TEC.1959.5222694. ISSN  0367-9950. CE-8(3):335–339 . Consultado el 2 de enero de 2016 .
  15. ^ Advanced Systems Group (6 de agosto de 1962), Descripción técnica del equipo de conexión para la toma de arreglos (informe), Fort Worth, Texas, EE. UU.: General Dynamics , FZE-052
  16. ^ ab Schmid, Hermann (1974). Cálculo decimal (1 ed.). Binghamton, Nueva York, Estados Unidos: John Wiley & Sons, Inc. págs. 162, 165–176, 181–193. ISBN 0-471-76180-X. Consultado el 3 de enero de 2016 . Hasta ahora se sabe que CORDIC se implementa sólo en forma binaria. Pero, como se demostrará aquí, el algoritmo puede modificarse fácilmente para un sistema decimal.* […] *Mientras tanto, se ha sabido que Hewlett-Packard y otros fabricantes de calculadoras emplean las técnicas decimales CORDIC en sus calculadoras científicas.
  17. ^ abcd Leibson, Steven (2010). "El proyecto HP 9100: una reacción exotérmica" . Consultado el 2 de enero de 2016 .
  18. ^ a b C Meggitt, John E. (29 de agosto de 1961). «Procesos de pseudodivisión y pseudomultiplicación» (PDF) . Revista IBM de investigación y desarrollo . 6 (2). Riverton, Nueva Jersey, EE. UU.: IBM Corporation (publicado en abril de 1962): 210–226, 287. doi :10.1147/rd.62.0210. Archivado desde el original (PDF) el 4 de febrero de 2022 . Consultado el 9 de enero de 2016 . John E. Meggitt Licenciado en Licenciatura, 1953; Doctorado, 1958, Universidad de Cambridge . Se le otorgó el Primer Premio Smith en Cambridge en 1955 y se le eligió una beca de investigación en el Emmanuel College . […] Se unió al Laboratorio Británico de IBM en Hursley, Winchester en 1958. Sus intereses incluyen códigos de corrección de errores y pequeñas computadoras microprogramadas.([3], [4])
  19. ^ abc Cochran, David S. (19 de noviembre de 2010). "Un cuarto de siglo en HP" (mecanografiado de la entrevista). Museo de Historia de la Computación / Memorias HP. 7: Calculadoras científicas, alrededor de 1966. CHM X5992.2011 . Consultado el 2 de enero de 2016 . Incluso volé al sur de California para hablar con Jack Volder, quien había implementado las funciones trascendentales en la máquina Athena , y hablé con él durante aproximadamente una hora. Me remitió a los artículos originales de Meggitt donde obtuvo las funciones generalizadas de pseudodivisión y pseudomultiplicación. […] Hice bastante investigación literaria que me llevó a algunos descubrimientos muy interesantes. […] Encontré un tratado de 1624 de Henry Briggs que analiza el cálculo de logaritmos comunes; curiosamente utilizó el mismo método de pseudodivisión/pseudomultiplicación que MacMillan y Volder usaron en Atenas . […] Habíamos comprado un LOCI-2 de Wang Labs y reconocimos que Wang Labs LOCI II usaba el mismo algoritmo para calcular la raíz cuadrada, así como logarítmico y exponencial. Después de la introducción del 9100, nuestro departamento legal recibió una carta de Wang diciendo que habíamos infringido su patente. Y acabo de enviar una nota con la referencia a Briggs en latín y decía: "Me parece una técnica anterior ". Nunca escuchamos otra palabra.([5])
  20. ^ ab Cochran, David S. (14 de marzo de 1966), Acerca de la utilización de CORDIC para calcular funciones trascendentales en BCD (comunicación privada con Jack E. Volder)
  21. ^ ab Osborne, Thomas E. (2010) [1994]. "La historia de Tom Osborne en sus propias palabras" . Consultado el 1 de enero de 2016 .
  22. ^ Leibson, Steven (2010). "La HP 9100: el viaje inicial" . Consultado el 2 de enero de 2016 .
  23. ^ Cochran, David S. (septiembre de 1968). "Programación Interna de la Calculadora 9100A". Diario de Hewlett-Packard . Palo Alto, California, Estados Unidos: Hewlett-Packard : 14-16 . Consultado el 2 de enero de 2016 .([6])
  24. ^ Amplíe su potencia informática personal con el nuevo instrumento de computación logarítmica LOCI-1, Wang Laboratories, Inc. , 1964, págs. 2-3 , consultado el 3 de enero de 2016
  25. ^ Bensene, Rick (31 de agosto de 2013) [1997]. "Wang LOCI-2". Museo Web de la Antigua Calculadora . Beavercreek, ciudad de Oregón, Oregón, Estados Unidos . Consultado el 3 de enero de 2016 .
  26. ^ "Manual de servicio de Wang LOCI" (PDF) . Laboratorios Wang, Inc. 1967. L55-67 . Consultado el 14 de septiembre de 2018 .
  27. ^ Bensene, Rick (23 de octubre de 2004) [1997]. "Sistema de calculadora Wang modelo 360SE". Museo Web de la Antigua Calculadora . Beavercreek, ciudad de Oregón, Oregón, Estados Unidos . Consultado el 3 de enero de 2016 .
  28. ^ abcd Cochran, David S. (junio de 2010). "El diseño HP-35, un estudio de caso en innovación". Proyecto de memoria HP . Consultado el 2 de enero de 2016 . Durante el desarrollo de la calculadora de escritorio HP 9100 fui responsable de desarrollar los algoritmos para adaptarlos a la arquitectura sugerida por Tom Osborne. Aunque la metodología sugerida para los algoritmos provino de Malcolm McMillan, leí una cantidad considerable para comprender los cálculos básicos […] Aunque los Laboratorios Wang habían utilizado métodos de cálculo similares, mi estudio encontró arte anterior fechado en 1624 que figuraba en sus patentes. […] Esta investigación permitió la adaptación de las funciones trascendentales mediante el uso de algoritmos para satisfacer las necesidades del cliente dentro de las limitaciones del hardware. Esto resultó invaluable durante el desarrollo del HP-35 , […] Para las funciones trascendentales se consideraron series de potencias , expansiones polinómicas , fracciones continuas y polinomios de Chebyshev . Todos eran demasiado lentos debido a la cantidad de multiplicaciones y divisiones requeridas. El algoritmo generalizado que mejor se adaptaba a los requisitos de velocidad y eficiencia de programación del HP-35 era un método iterativo de pseudodivisión y pseudomultiplicación descrito por primera vez en 1624 por Henry Briggs en ' Arithmetica Logarithmica ' y posteriormente por Volder y Meggitt. Este es el mismo tipo de algoritmo que se utilizó en las calculadoras de escritorio HP anteriores. […] La complejidad de los algoritmos hizo que la programación multinivel fuera una necesidad. Esto significaba que la calculadora tenía que tener capacidad de subrutina, […] Para generar una función trascendental como Arc-Hyperbolic-Tan se requerían varios niveles de subrutinas. […] Chris Clare luego documentó esto como metodología de máquina algorítmica de estados (ASM). Incluso el seno o coseno simple usó la rutina tangente y luego calculó el seno a partir de identidades trigonométricas. Estas arduas manipulaciones fueron necesarias para minimizar la cantidad de programas y pasos de programa únicos […] El conjunto de instrucciones aritméticas fue diseñado específicamente para una calculadora de función trascendental decimal. Las operaciones aritméticas básicas las realiza un sumador-restador en complemento a 10 que tiene rutas de datos a tres de los registros que se utilizan como almacenamiento de trabajo.
  29. ^ Patente estadounidense 3402285A, Wang, An , "Aparato de cálculo", publicada el 17 de septiembre de 1968, expedida el 17 de septiembre de 1968, asignada a Wang Laboratories  ([7], [8])
  30. ^ Patente DE 1499281B1, Wang, An , "Rechenmaschine fuer logarithmische Rechnungen", publicada el 6 de mayo de 1970, publicada el 6 de mayo de 1970, asignada a Wang Laboratories ([9]) 
  31. ^ Swartzlander, Jr., Earl E. (1990). Aritmética informática. vol. 1 (2 ed.). Los Alamitos: Prensa de la IEEE Computer Society . ISBN 9780818689314. 0818689315 . Consultado el 2 de enero de 2016 .
  32. ^ Petrocelli, Orlando R., ed. (1972), Los mejores artículos informáticos de 1971, Auerbach Publishers , pág. 71, ISBN 0877691274, consultado el 2 de enero de 2016
  33. ^ Cochran, David S. (junio de 1972). «Algoritmos y Precisión en la HP-35» (PDF) . Diario de Hewlett-Packard . 23 (10): 10–11. Archivado desde el original (PDF) el 4 de octubre de 2013 . Consultado el 2 de enero de 2016 .
  34. ^ Laporte, Jacques (6 de diciembre de 2005). "Algoritmo trigonométrico HP35". París, Francia. Archivado desde el original el 9 de marzo de 2015 . Consultado el 2 de enero de 2016 .[10] Archivado el 10 de agosto de 2020 en Wayback Machine.
  35. ^ Laporte, Jacques (febrero de 2005) [1981]. "El secreto de los algoritmos". L'Ordinateur Individuel (24). París, Francia. Archivado desde el original el 18 de agosto de 2016 . Consultado el 2 de enero de 2016 .[11] Archivado el 12 de junio de 2021 en Wayback Machine.
  36. ^ Laporte, Jacques (febrero de 2012) [2006]. "Métodos dígito a dígito". París, Francia. Archivado desde el original el 18 de agosto de 2016 . Consultado el 2 de enero de 2016 .[12] Archivado el 12 de junio de 2021 en Wayback Machine.
  37. ^ Laporte, Jacques (febrero de 2012) [2007]. "Algoritmo logarítmico HP 35". París, Francia. Archivado desde el original el 18 de agosto de 2016 . Consultado el 7 de enero de 2016 .[13] Archivado el 10 de agosto de 2020 en Wayback Machine.
  38. ^ Wang, Yuxuan; Luo, Yuanyong; Wang, Zhongfeng; Shen, Qinghong; Pan, Hongbing (enero de 2020). "Arquitectura basada en GH CORDIC para calcular la raíz enésima de un número de coma flotante de precisión simple". Transacciones IEEE en sistemas de integración a muy gran escala (VLSI) . 28 (4): 864–875. doi :10.1109/TVLSI.2019.2959847. S2CID  212975618.
  39. ^ Mopuri, Suresh; Acharyya, Amit (septiembre de 2019). "Metodología de diseño de arquitectura VLSI genérica de baja complejidad para cálculos de enésima raíz y enésima potencia". Transacciones IEEE sobre circuitos y sistemas I: artículos habituales . 66 (12): 4673–4686. doi :10.1109/TCSI.2019.2939720. S2CID  203992880.
  40. ^ Vachhani, Leena (noviembre de 2019). "CORDIC como sistema no lineal conmutado". Circuitos, Sistemas y Procesamiento de Señales . 39 (6): 3234–3249. doi :10.1007/s00034-019-01295-8. S2CID  209904108.
  41. ^ Schmid, Hermann ; Bogacki, Anthony (20 de febrero de 1973). "Utilice CORDIC decimal para generar muchas funciones trascendentales". EDN : 64–73.
  42. ^ Franke, Richard (8 de mayo de 1973). Un análisis de algoritmos para la evaluación de hardware de funciones elementales (PDF) . Monterey, California, EE.UU.: Departamento de Marina , Escuela Naval de Postgrado . NPS-53FE73051A . Consultado el 3 de enero de 2016 .
  43. ^ abcde Müller, Jean-Michel (2006). Funciones elementales: algoritmos e implementación (2 ed.). Boston: Birkhäuser . pag. 134.ISBN 978-0-8176-4372-0. LCCN  2005048094 . Consultado el 1 de diciembre de 2015 .
  44. ^ ab Nave, Rafi (marzo de 1983). "Implementación de funciones trascendentales en un procesador numérico". Microprocesamiento y Microprogramación . 11 (3–4): 221–225. doi :10.1016/0165-6074(83)90151-5.
  45. ^ Palmer, John F.; Morse, Stephen Paul (1984). La cartilla 8087 (1 ed.). John Wiley & Sons Australia, limitada . ISBN 0471875694. 9780471875697 . Consultado el 2 de enero de 2016 .
  46. ^ Glass, L. Brent (enero de 1990). "Coprocesadores matemáticos: una mirada a lo que hacen y cómo lo hacen". Byte . 15 (1): 337–348. ISSN  0360-5280.
  47. ^ abc Jarvis, Pitts (1 de octubre de 1990). "Implementación de algoritmos CORDIC: una única rutina compacta para calcular funciones trascendentales". Diario del Dr. Dobb : 152-156. Archivado desde el original el 4 de marzo de 2016 . Consultado el 2 de enero de 2016 .
  48. ^ ab Yuen, Alaska (1988). "Procesadores de punto flotante de Intel". Registro de la conferencia Electro/88 : 48/5/1–7.
  49. ^ Meher, Pramod Kumar; Valls, Javier; Juang, Tso-Bing; Sridharan, K.; Maharatna, Koushik (22 de agosto de 2008). "50 años de CORDIC: algoritmos, arquitecturas y aplicaciones" (PDF) . Transacciones IEEE sobre circuitos y sistemas I: artículos habituales . 56 (9) (publicado el 9 de septiembre de 2009): 1893–1907. doi :10.1109/TCSI.2009.2025803. S2CID  5465045.
  50. ^ Meher, Pramod Kumar; Park, Sang Yoon (febrero de 2013). "Metodología de diseño de arquitectura VLSI genérica de baja complejidad para cálculos de enésima raíz y enésima potencia". Transacciones IEEE en sistemas de integración a muy gran escala (VLSI) . 21 (2): 217–228. doi :10.1109/TVLSI.2012.2187080. S2CID  7059383.
  51. ^ Heffron, WG; LaPiana, F. (11 de diciembre de 1970). «Memorando Técnico 70-2014-8: El Sistema de Navegación del Vehículo Itinerante Lunar» (PDF) . NASA . Washington, DC, Estados Unidos: Bellcomm . pag. 14.
  52. ^ Smith, serio C.; Mastin, William C. (noviembre de 1973). "Nota técnica D-7469: Revisión del rendimiento del sistema de navegación de vehículos itinerantes lunares" (PDF) . NASA . Huntsville, Alabama, Estados Unidos: Centro Marshall de vuelos espaciales . pag. 17.
  53. ^ Shiriff, Ken (mayo de 2020). "Extracción de constantes ROM del chip del coprocesador matemático 8087". derecho.com . Consultado el 3 de septiembre de 2020 . La ROM contiene 16 valores de arcotangentes, los arctanes de 2 −n . También contiene 14 valores logarítmicos, los registros de base 2 de (1+2 −n ). Estos pueden parecer valores inusuales, pero se utilizan en un algoritmo eficiente llamado CORDIC, que se inventó en 1958.
  54. ^ "Comenzando con el acelerador CORDIC utilizando el paquete MCU STM32CubeG4" (PDF) . STMicroelectrónica . Consultado el 1 de enero de 2021 .
  55. ^ "CMSIS/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c". Github . BRAZO . Consultado el 1 de enero de 2021 .
  56. ^ "Límites de error de la expansión de Taylor para seno". Intercambio de pila de matemáticas . Consultado el 1 de enero de 2021 .
  57. ^ Andraka, Ray (1998). "Un estudio de los algoritmos CORDIC para computadoras basadas en FPGA" (PDF) . ACM . North Kingstown, RI, EE. UU.: Andraka Consulting Group, Inc. 0-89791-978-5/98/01 . Consultado el 8 de mayo de 2016 .
  58. ^ "Clase de matemáticas". Estándar de plataforma Java (8 ed.). Corporación Oráculo . 2018 [1993]. Archivado desde el original el 6 de agosto de 2018 . Consultado el 6 de agosto de 2018 .
  59. ^ "ldexp, ldexpf, ldexpl". cppreference.com . 2015-06-11. Archivado desde el original el 6 de agosto de 2018 . Consultado el 6 de agosto de 2018 .
  60. ^ "Sección 8.3.9 Logarítmica, exponencial y escala". Manual del desarrollador de software de arquitecturas Intel 64 e IA-32 Volumen 1: Arquitectura básica (PDF) . Corporación Intel . Septiembre de 2016. págs. 8-22.
  61. ^ Baykov, Vladimir. "El esquema (autoreferat) de mi doctorado, publicado en 1972". baykov.de . Consultado el 3 de mayo de 2023 .
  62. ^ Baykov, Vladimir. "Implementación hardware de funciones elementales en ordenadores". baykov.de . Consultado el 3 de mayo de 2023 .
  63. ^ ab Baykov, Vladimir. "Procesadores de propósito especial: estructuras y algoritmos iterativos". baykov.de . Consultado el 3 de mayo de 2023 .

Otras lecturas

enlaces externos