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 una solución digital en tiempo real más precisa y rápida. [11] Por lo tanto, a veces se hace referencia a CORDIC como un resolver digital. [12] [13]
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 discutió la posibilidad de calcular la rotación de coordenadas hiperbólicas , logaritmos y funciones exponenciales con algoritmos CORDIC modificados. [10] [11] La utilización de CORDIC para la multiplicación y la división también se concibió en esta época. [11] Basándose 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 toma de posición de radar llamado CORDIC I , completado en 1960 sin Volder, quien ya había dejado la compañía. [1] [11] Los modelos CORDIC II más universales A (estacionario) y B (aerotransportado) fueron construidos y probados por Daggett y Harry Schuss en 1962. [11] [15]
Volder se asoció con Malcolm McMillan para construir Athena , una calculadora de escritorio de punto fijo que utilizaba su algoritmo binario CORDIC. [17] El diseño fue presentado a Hewlett-Packard en junio de 1965, pero no fue aceptado. [17] Aún así, McMillan le 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 pseudo-multiplicación y pseudo-división en 1961. [18] [19] El método de Meggitt también sugería el uso de la base 10 [18] en lugar de la base 2 , como se usaba hasta ahora en el CORDIC de Volder. Estos esfuerzos llevaron a la implementación de lógica ROMable de un prototipo de máquina decimal CORDIC dentro de Hewlett-Packard en 1966, [20] [19] construido y conceptualmente derivado de la Green Machine prototípica de Thomas E. Osborne , una calculadora de escritorio de punto flotante de cuatro funciones 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, con producción en serie comenzando más tarde ese año. [17] [21] [22] [23]
Cuando los Laboratorios Wang descubrieron que la HP 9100A utilizaba un enfoque similar al método de combinación de factores de sus 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 infringir una de las patentes de An Wang en 1968. [19] [28] [29] [30]
John Stephen Walther en Hewlett-Packard generalizó el algoritmo en el algoritmo CORDIC unificado en 1971, lo que le permitió 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 resultó en la primera calculadora científica portátil , la HP-35 en 1972. [28] [33] [34] [35] [36] [37] Basándose en CORDIC hiperbólico, Yuanyong Luo et al. Además, propuso 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, el CORDIC hiperbólico es un caso especial de GH CORDIC. [5]
Originalmente, CORDIC se implementó utilizando únicamente el sistema numérico binario y a pesar de que Meggitt sugirió el uso del sistema decimal para su enfoque de pseudo-multiplicación, el CORDIC decimal continuó siendo prácticamente desconocido durante varios años más, de modo que Hermann Schmid y Anthony Bogacki todavía lo sugirieron como una novedad en 1973 [16] [13] [41] [42] [43] y solo más tarde se descubrió que Hewlett-Packard ya lo había implementado en 1966. [11] [13] [20] [28]
El sistema CORDIC decimal se ha extendido en las calculadoras de bolsillo [13], la mayoría de las cuales funcionan en sistema decimal codificado en binario (BCD) en lugar de en binario. Este cambio en el formato de entrada y salida no alteró los algoritmos básicos de cálculo de CORDIC. CORDIC es especialmente adecuado para las 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 los coprocesadores basados en ARM STM32G4 , Intel 8087 , [43] [44] [45] [46] [47] 80287 , [47] [48] 80387 [47] [48] hasta la serie 80486 [43] así como en los Motorola 68881 [43] [44] y 68882 para algunos tipos de instrucciones de punto flotante, principalmente como una forma de reducir los conteos de puertas (y la complejidad) del subsistema FPU .
Aplicaciones
CORDIC utiliza operaciones simples de suma y desplazamiento 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 en valores singulares , factorización QR y muchas otras. 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 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 del programa Apolo para calcular el rumbo y el alcance, o la 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 la cantidad de puertas necesarias para implementar las funciones que admite (por ejemplo, en un FPGA o ASIC ). De hecho, CORDIC es una IP estándar en aplicaciones de desarrollo de FPGA como Vivado para Xilinx, mientras que una implementación de serie de potencias no lo es debido a la especificidad de dicha IP, es decir, CORDIC puede calcular muchas funciones diferentes (propósito general) mientras que un multiplicador de hardware configurado para ejecutar implementaciones de serie de potencias solo puede calcular la función para la que fue diseñado.
Por otra parte, cuando se dispone de un multiplicador de hardware ( por ejemplo , en un microprocesador DSP ), los métodos de búsqueda en tablas y series de potencias 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 requerida ]
La serie STM32G4 y ciertas series STM32H7 de MCU implementan un módulo CORDIC para acelerar los cálculos en varias aplicaciones de señal mixta, 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 serie 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 ligeramente menos precisos, ya que los módulos CORDIC proporcionados solo alcanzan 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 completa (24 bits) y probablemente puede lograr un error relativo a esa precisión. [55] Otro beneficio es que el módulo CORDIC es un coprocesador y se puede ejecutar en paralelo con otras tareas de la CPU.
El problema con el uso de series de Taylor es que, si bien proporcionan un pequeño error absoluto, no muestran un error relativo bien comportado. [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 que solo admiten números enteros han implementado CORDIC en distintos grados como parte de sus bibliotecas de punto flotante IEEE . Como la mayoría de las CPU modernas de propósito general tienen registros de punto flotante con operaciones comunes como sumar, restar, multiplicar, dividir, seno, coseno, raíz cuadrada, logaritmo de 10 y logaritmo natural, la necesidad de implementar CORDIC en ellas con software es casi inexistente. Solo los microcontroladores o las aplicaciones de software especiales con restricciones de tiempo y seguridad necesitarían considerar el uso de CORDIC.
Modos de funcionamiento
Modo de rotación
CORDIC se puede utilizar para calcular una serie de funciones diferentes. Esta explicación muestra cómo utilizar CORDIC en modo de rotación para calcular el seno y el coseno de un ángulo, suponiendo que el ángulo deseado se da en radianes y se representa en un formato de punto fijo. Para determinar el seno o el coseno de un ángulo , se debe encontrar la coordenada y o x de un punto en el círculo unitario correspondiente al ángulo deseado. Utilizando CORDIC, se comenzaría con el vector :
En la primera iteración, este vector se rota 45° en sentido antihorario para obtener el vector . Las iteraciones sucesivas rotan el vector en una u otra dirección en pasos de tamaño decreciente, hasta que se logra el ángulo deseado. Cada paso del ángulo 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 expresión para el vector rotado se convierte entonces en:
donde y son los componentes de . Fijando el ángulo para cada iteración de modo que aún se obtenga una serie que converja a cada valor de salida posible. Por lo tanto, la multiplicación por la tangente se puede reemplazar por una división por una potencia de dos, lo que se hace de manera eficiente en hardware de computadora digital utilizando un desplazamiento de bit . La expresión entonces se convierte en:
y se utiliza para determinar la dirección de la rotación: si el ángulo es positivo, entonces es +1, de lo contrario es −1.
La siguiente identidad trigonométrica se puede utilizar para reemplazar el coseno:
,
dando este multiplicador para cada iteración:
Los factores pueden luego sacarse del proceso iterativo y aplicarse todos a la vez posteriormente 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 se podría realizar de antemano, escalando y, por lo tanto, ahorrando 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 da como resultado una ganancia de procesamiento : [57]
Después de una cantidad 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 llevando un registro de cuánto se rotó el ángulo en cada iteración y restando ese valor del ángulo deseado; luego, para acercarse al ángulo deseado , si es positivo, la rotación es en el sentido de las agujas del reloj; de lo 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 con para reducir el tamaño de la tabla.
Como se puede ver en la ilustración de arriba, 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 la dirección de la rotación dependen de si es 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 como objetivo 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 la 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 . Por lo tanto, 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 , importe atan2 , sqrt , sen , cos , radianesITERS = 16theta_table = [ atan2 ( 1 , 2 ** i ) para i en el rango ( ITERS )]definición computar_K ( n ):""" Calcular K(n) para n = ITERS. Esto también podría ser se almacena como una constante explícita si el ITERS anterior es fijo. """k = 1.0para i en rango ( n ):k *= 1 / raíz cuadrada ( 1 + 2 ** ( - 2 * i ))devuelve kdefinición CORDIC ( alfa , n ):K_n = calcular_K ( n )theta = 0,0x = 1.0y = 0.0P2i = 1 # Esto será 2**(-i) en el bucle siguientePara arc_tangent en theta_table :sigma = + 1 si theta < alfa de lo contrario - 1theta += sigma * arco_tangentex , y = x - sigma * y * P2i , sigma * P2i * x + yP2i /= 2devuelve x * K_n , y * K_nsi __nombre__ == "__principal__" :# Imprima una tabla de senos y cosenos calculados, desde -90° a +90°, en pasos de 15°,# comparando con las rutinas matemáticas disponibles.imprimir ( " x sin(x) diff. seno cos(x) diff. 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 } )")
El número de puertas lógicas para la implementación de un CORDIC es aproximadamente comparable al número requerido para un multiplicador, ya que ambos requieren combinaciones de desplazamientos y adiciones. La elección de una implementación basada en multiplicadores o basada en 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 mediante un solo CORDIC que opere sobre números complejos representados por sus coordenadas polares, especialmente si la magnitud de los números no es relevante (multiplicar un vector complejo con un vector en el círculo unitario en realidad equivale a una rotación). Los CORDIC se utilizan a menudo en circuitos para telecomunicaciones, como los convertidores descendentes digitales .
Doble iteración CORDIC
En dos de las publicaciones de Vladimir Baykov, [61] [62] se propuso utilizar el método de doble iteración para la implementación de las funciones: arcoseno, arcocoseno, logaritmo natural, función exponencial, así como para el cálculo de las funciones hiperbólicas. 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 solo a través de una iteración. De ahí que apareciera 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, es suficiente realizar iteraciones para cada valor de i (i = 0 o 1 a n, 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 del número, es decir, para cada valor de . [63]
Para las funciones seno y arcoseno hiperbólicos inversos, 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 logarítmicos 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 de los algoritmos logarítmicos y 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 ).
^ abc Volder, Jack E. (3 de marzo de 1959). "La técnica de computación CORDIC" (PDF) . Actas de la Western Joint Computer Conference (WJCC) (presentación). San Francisco, California, EE. UU.: National Joint Computer Committee (NJCC): 257–261 . Consultado el 2 de enero de 2016 .
^ ab Volder, Jack E. (25 de mayo de 1959). "La técnica de cálculo trigonométrico CORDIC" (PDF) . IRE Transactions on Electronic Computers . 8 (3). The Institute of Radio Engineers, Inc. (IRE) (publicado en septiembre de 1959): 330–334 (reimpresión: 226–230). EC-8(3):330–334. Archivado desde el original (PDF) el 12 de junio de 2021. Consultado el 1 de enero de 2016 .
^ ab Walther, John Stephen (junio de 2000). "La historia de CORDIC unificado". The Journal of VLSI Signal Processing . 25 (2 (Número especial sobre CORDIC)). Hingham, MA, EE. UU.: Kluwer Academic Publishers : 107–112. Bibcode :2000JSPSy..25..107W. doi :10.1023/A:1008162721424. ISSN 0922-5773. S2CID 26922158.
^ abc Luo, Yuanyong; Wang, Yuxuan; Ha, 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". IEEE Transactions on Very Large Scale Integration (VLSI) Systems . 27 (9): 2156–2169. doi :10.1109/TVLSI.2019.2919557. S2CID 196171166.
^ ab Luo, Yuanyong; Wang, Yuxuan; Ha, Yajun; Wang, Zhongfeng; Chen, Siyuan; Pan, Hongbing (septiembre de 2019). "Correcciones a "CORDIC hiperbólico generalizado y su cálculo logarítmico y exponencial con base fija arbitraria"". Transacciones IEEE sobre sistemas de integración a muy gran escala (VLSI) . 27 (9): 2222. doi :10.1109/TVLSI.2019.2932174. S2CID 201711001.
^ Laporte, Jacques (2014) [2005]. «Henry Briggs y la 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.
^ Flower, Robert (1771). The Radix. A new way of making logarithms [La base. Una nueva forma de hacer logaritmos]. Londres: J. Beecroft . Consultado el 2 de enero de 2016 .
^ 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
^ abcdefghijkl Volder, Jack E. (junio de 2000). "El nacimiento de CORDIC" (PDF) . Journal of VLSI Signal Processing . 25 (2 (Número especial sobre CORDIC)). Hingham, MA, EE. UU.: Kluwer Academic Publishers : 101–105. Bibcode :2000JSPSy..25..101V. doi :10.1023/A:1008110704586. ISSN 0922-5773. S2CID 112881. Archivado desde el original (PDF) el 2016-03-04 . Consultado el 2016-01-02 .
^ 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 de PZ Perle o en Diseño de componentes ).
^ abcde Schmid, Hermann (1983) [1974]. Cálculo decimal (1.ª edición, reimpresión). Malabar, Florida, EE. UU.: Robert E. Krieger Publishing Company. pp. 162, 165–176, 181–193. ISBN0-89874-318-4. Recuperado el 3 de enero de 2016 .(NB. Al menos algunos lotes de esta edición reimpresa contenían errores de impresión con páginas defectuosas en las páginas 115-146).
^ Advanced Systems Group (1962-08-06), Descripción técnica de equipos de conexión de toma de reparaciones (informe), Fort Worth, Texas, EE. UU.: General Dynamics , FZE-052
^ ab Schmid, Hermann (1974). Cálculo decimal (1.ª ed.). Binghamton, Nueva York, EE. UU.: John Wiley & Sons, Inc. , págs. 162, 165-176, 181-193. ISBN0-471-76180-X. Recuperado el 3 de enero de 2016. Hasta ahora, se sabía que CORDIC se implementaba solo en forma binaria. Pero, como se demostrará aquí, el algoritmo se puede modificar fácilmente para un sistema decimal.* […] *Mientras tanto, se ha sabido que Hewlett-Packard y otros fabricantes de calculadoras emplean las técnicas decimales de CORDIC en sus calculadoras científicas.
^ abcd Leibson, Steven (2010). "El proyecto HP 9100: una reacción exotérmica" . Consultado el 2 de enero de 2016 .
^ abc Cochran, David S. (19 de noviembre de 2010). "Un cuarto de siglo en HP" (entrevista mecanografiada). Computer History Museum / HP Memories. 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, que había implementado las funciones trascendentales en la máquina Athena , y hablé con él durante aproximadamente una hora. Me refirió a los documentos originales de Meggitt, donde había obtenido las funciones generalizadas de pseudodivisión y pseudomultiplicación. […] Realicé bastante investigación literaria que me llevó a algunos descubrimientos muy interesantes. […] Encontré un tratado de 1624 de Henry Briggs que analizaba el cálculo de logaritmos comunes y que, curiosamente, utilizaba el mismo método de pseudodivisión/pseudomultiplicación que MacMillan y Volder usaron en Athena . […] Habíamos comprado un LOCI-2 de Wang Labs y nos dimos cuenta de que el LOCI II de Wang Labs utilizaba el mismo algoritmo para hacer la raíz cuadrada, así como el logaritmo y la 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 simplemente envié una nota con la referencia de Briggs en latín y decía: "A mí me parece que es técnica anterior ". Nunca más volvimos a saber nada más.([5])
^ ab Cochran, David S. (14 de marzo de 1966), Acerca del uso de CORDIC para calcular funciones trascendentales en BCD (comunicación privada con Jack E. Volder)
^ ab Osborne, Thomas E. (2010) [1994]. "La historia de Tom Osborne en sus propias palabras" . Consultado el 1 de enero de 2016 .
^ Leibson, Steven (2010). "La HP 9100: el viaje inicial" . Consultado el 2 de enero de 2016 .
^ Cochran, David S. (septiembre de 1968). "Programación interna de la calculadora 9100A". Hewlett-Packard Journal . Palo Alto, California, EE. UU.: Hewlett-Packard : 14–16 . Consultado el 2 de enero de 2016 .([6])
^ Amplíe su capacidad 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
^ Bensene, Rick (31 de agosto de 2013) [1997]. "Wang LOCI-2". Museo Web de la Calculadora Antigua . Beavercreek, Oregon City, Oregón, EE. UU . Consultado el 3 de enero de 2016 .
^ "Manual de servicio de Wang LOCI" (PDF) . Wang Laboratories, Inc. 1967. L55-67 . Consultado el 14 de septiembre de 2018 .
^ Bensene, Rick (23 de octubre de 2004) [1997]. "Sistema de calculadora Wang Model 360SE". Museo Web de calculadoras antiguas . Beavercreek, Oregon City, Oregón, EE. UU . Consultado el 3 de enero de 2016 .
^ abcd Cochran, David S. (junio de 2010). "El diseño de la HP-35, un estudio de caso de 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 que se ajustaran 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 Wang Laboratories había utilizado métodos de cálculo similares, mi estudio encontró tecnología anterior con fecha de 1624 que se leía en sus patentes. […] Esta investigación permitió la adaptación de las funciones trascendentales mediante el uso de los algoritmos para satisfacer las necesidades del cliente dentro de las limitaciones del hardware. Esto resultó invaluable durante el desarrollo de la HP-35 , […] Se consideraron series de potencias , expansiones polinómicas , fracciones continuas y polinomios de Chebyshev para las funciones trascendentales. Todas eran demasiado lentas debido al número de multiplicaciones y divisiones requeridas. El algoritmo generalizado que mejor se adaptaba a los requisitos de velocidad y eficiencia de programación para la HP-35 era un método iterativo de pseudo-división y pseudo-multiplicación descrito por primera vez en 1624 por Henry Briggs en ' Arithmetica Logarithmica ' y más tarde 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 subrutinas, […] Para generar una función trascendental como Arc-Hyperbolic-Tan se necesitaban varios niveles de subrutinas. […] Chris Clare documentó esto más tarde como metodología de Máquina de Estados Algorítmicos (ASM). Incluso el simple Seno o Coseno usaba la rutina Tangente y luego calculaba el Seno a partir de identidades trigonométricas. Estas arduas manipulaciones eran necesarias para minimizar el número de programas únicos y pasos de programa […] 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 se realizan mediante un sumador-restador de complemento a 10 que tiene rutas de datos a tres de los registros que se utilizan como almacenamiento de trabajo.
^ 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])
^ 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])
^ Swartzlander, Jr., Earl E. (1990). Aritmética informática. Vol. 1 (2.ª ed.). Los Alamitos: IEEE Computer Society Press . ISBN9780818689314. 0818689315 . Consultado el 2 de enero de 2016 .
^ Petrocelli, Orlando R., ed. (1972), Los mejores artículos informáticos de 1971, Auerbach Publishers , pág. 71, ISBN0877691274, consultado el 2 de enero de 2016
^ Cochran, David S. (junio de 1972). "Algoritmos y precisión en la HP-35" (PDF) . Hewlett-Packard Journal . 23 (10): 10–11. Archivado desde el original (PDF) el 2013-10-04 . Consultado el 2016-01-02 .
^ 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.
^ 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.
^ 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.
^ Laporte, Jacques (febrero de 2012) [2007]. «Algoritmo de logaritmo 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.
^ 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 punto flotante de precisión simple". IEEE Transactions on Very Large Scale Integration (VLSI) Systems . 28 (4): 864–875. doi :10.1109/TVLSI.2019.2959847. S2CID 212975618.
^ Mopuri, Suresh; Acharyya, Amit (septiembre de 2019). "Metodología de diseño de arquitectura VLSI genérica de baja complejidad para cálculos de raíz N y potencia N". IEEE Transactions on Circuits and Systems I: Regular Papers . 66 (12): 4673–4686. doi :10.1109/TCSI.2019.2939720. S2CID 203992880.
^ Vachhani, Leena (noviembre de 2019). "CORDIC como un sistema no lineal conmutado". Circuitos, sistemas y procesamiento de señales . 39 (6): 3234–3249. doi :10.1007/s00034-019-01295-8. S2CID 209904108.
^ Schmid, Hermann ; Bogacki, Anthony (20 de febrero de 1973). "Utilice CORDIC decimal para generar muchas funciones trascendentales". EDN : 64–73.
^ 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 la Marina , Escuela Naval de Postgrado . NPS-53FE73051A . Consultado el 3 de enero de 2016 .
^ abcde Muller, Jean-Michel (2006). Funciones elementales: algoritmos e implementación (2.ª ed.). Boston: Birkhäuser . pág. 134. ISBN978-0-8176-4372-0. LCCN 2005048094 . Consultado el 1 de diciembre de 2015 .
^ 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.
^ 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.
^ abc Jarvis, Pitts (1990-10-01). "Implementación de algoritmos CORDIC: una rutina compacta única para calcular funciones trascendentales". Dr. Dobb's Journal : 152–156. Archivado desde el original el 2016-03-04 . Consultado el 2016-01-02 .
^ ab Yuen, AK (1988). "Procesadores de punto flotante de Intel". Acta de la conferencia Electro/88 : 48/5/1–7.
^ 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) . IEEE Transactions on Circuits and Systems I: Regular Papers . 56 (9) (publicado el 9 de septiembre de 2009): 1893–1907. doi :10.1109/TCSI.2009.2025803. S2CID 5465045.
^ 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 raíz N y potencia N". IEEE Transactions on Very Large Scale Integration (VLSI) Systems . 21 (2): 217–228. doi :10.1109/TVLSI.2012.2187080. S2CID 7059383.
^ Heffron, WG; LaPiana, F. (11 de diciembre de 1970). "Memorando técnico 70-2014-8: El sistema de navegación del vehículo lunar" (PDF) . NASA . Washington, DC, EE. UU.: Bellcomm . pág. 14.
^ Smith, Earnest C.; Mastin, William C. (noviembre de 1973). "Nota técnica D-7469: Revisión del rendimiento del sistema de navegación del vehículo lunar" (PDF) . NASA . Huntsville, Alabama, EE. UU.: Centro Marshall de Vuelos Espaciales . pág. 17.
^ Shirriff, Ken (mayo de 2020). "Extracción de constantes de ROM de la matriz del coprocesador matemático 8087". righto.com . Consultado el 3 de septiembre de 2020 . La ROM contiene 16 valores de arcotangente, los arctangentes de 2 −n . También contiene 14 valores de logaritmo, los logaritmos en 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.
^ "Introducción al acelerador CORDIC con el paquete MCU STM32CubeG4" (PDF) . STMicroelectronics . Consultado el 1 de enero de 2021 .
^ "CMSIS/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c". Github . ARM . Consultado el 1 de enero de 2021 .
^ "Límites de error de la expansión de Taylor para seno". Math Stack Exchange . Consultado el 1 de enero de 2021 .
^ Andraka, Ray (1998). "Un estudio de 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 .
^ "Class Math". Java Platform Standard (8.ª ed.). Oracle Corporation . 2018 [1993]. Archivado desde el original el 6 de agosto de 2018. Consultado el 6 de agosto de 2018 .
^ "ldexp, ldexpf, ldexpl". cppreference.com . 2015-06-11. Archivado desde el original el 2018-08-06 . Consultado el 2018-08-06 .
^ "Sección 8.3.9 Arquitectura logarítmica, exponencial y de escala". Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 1: arquitectura básica (PDF) . Intel Corporation . Septiembre de 2016. págs. 8–22.
^ Baykov, Vladimir. "El esquema (autorreferencia) de mi tesis doctoral, publicada en 1972". baykov.de . Consultado el 3 de mayo de 2023 .
^ Baykov, Vladimir. "Implementación de hardware de funciones elementales en computadoras". baykov.de . Consultado el 3 de mayo de 2023 .
^ ab Baykov, Vladimir. "Procesadores de propósito especial: algoritmos y estructuras iterativas". baykov.de . Consultado el 3 de mayo de 2023 .
Lectura adicional
Parini, Joseph A. (5 de septiembre de 1966). "DIVIC da respuesta a cuestiones complejas de navegación". Electrónica : 105–111. ISSN 0013-5070.(NB. DIVIC significa Digital Variable Increments Computer (computadora de incrementos variables digitales) . Algunas fuentes se refieren erróneamente a esto como obra de JM Parini ).
Anderson, Stanley F.; Earle, John G.; Goldschmidt, Robert Elliott; Powers, Don M. (1965-11-01). "The IBM System/360 Model 91: Floating-Point Execution Unit" (PDF) . IBM Journal of Research and Development . 11 (1). Riverton, Nueva Jersey, EE. UU. (publicado en enero de 1967): 34–53. doi :10.1147/rd.111.0034. Archivado desde el original (PDF) el 2016-03-05 . Consultado el 2016-01-02 .
Liccardo, Michael A. (septiembre de 1968). Un procesador de interconexión con énfasis en la operación en modo CORDIC (tesis de maestría). Berkeley, CA, EE. UU.: Universidad de California, Berkeley , Departamento de Ingeniería Eléctrica. OCLC 500565168.
Patente estadounidense 3576983A, Cochran, David S., "Sistema de calculadora digital para calcular raíces cuadradas", publicada el 4 de mayo de 1971, expedida el 4 de mayo de 1971, asignada a Hewlett-Packard Co. ([14])
Chen, Tien Chi (julio de 1972). «Cálculo automático de exponenciales, logaritmos, proporciones y raíces cuadradas» (PDF) . IBM Journal of Research and Development . 16 (4): 380–388. doi :10.1147/rd.164.0380. ISSN 0018-8646. Archivado desde el original (PDF) el 2016-08-12 . Consultado el 2016-01-02 .
Egbert, William E. (mayo de 1977). «Algoritmos de calculadoras personales I: raíces cuadradas» (PDF) . Hewlett-Packard Journal . 28 (9). Palo Alto, California, EE. UU.: Hewlett-Packard : 22–24. Archivado desde el original (PDF) el 18 de diciembre de 2015. Consultado el 2 de enero de 2016 .([15])
Egbert, William E. (junio de 1977). «Algoritmos de calculadora personal II: funciones trigonométricas» (PDF) . Hewlett-Packard Journal . 28 (10). Palo Alto, California, EE. UU.: Hewlett-Packard : 17–20. Archivado desde el original (PDF) el 4 de marzo de 2016. Consultado el 2 de enero de 2016 .([16])
Egbert, William E. (noviembre de 1977). «Algoritmos de calculadora personal III: funciones trigonométricas inversas» (PDF) . Hewlett-Packard Journal . 29 (3). Palo Alto, California, EE. UU.: Hewlett-Packard : 22–23. Archivado desde el original (PDF) el 4 de marzo de 2016. Consultado el 2 de enero de 2016 .([17])
Egbert, William E. (abril de 1978). «Algoritmos de calculadora personal IV: funciones logarítmicas» (PDF) . Hewlett-Packard Journal . 29 (8). Palo Alto, California, EE. UU.: Hewlett-Packard : 29–32. Archivado desde el original (PDF) el 4 de marzo de 2016. Consultado el 2 de enero de 2016 .([18])
Senzig, Don (1975). "Algoritmos de calculadora". IEEE Compcon Reader Digest . IEEE : 139–141. Catálogo IEEE n.º 75 CH 0920-9C.
Baykov, Vladimir D. (1972), Вопросы исследования вычисления элементарных функций по методу «цифра за цифрой» [Problemas de evaluación de funciones elementales basadas en la técnica dígito por dígito (CORDIC) ] (tesis doctoral) ( en ruso), Universidad Estatal de Leningrado de Electrotecnia
Baykov, Vladimir D.; Smolov, Vladimir B. (1975). Apparaturnaja realizatsija elementarnikh funktsij v CVM Аппаратурная реализация элементарных функций в ЦВМ [Implementación de hardware de funciones elementales en computadoras ] (en ruso). Universidad Estatal de Leningrado. Archivado desde el original el 2019-03-02 . Consultado el 2 de marzo de 2019 .
Baykov, Vladimir D.; Seljutin, SA (1982). Вычисление элементарных функций в ЭКВМ[ Evaluación de funciones elementales en microcalculadoras ] (en ruso). Moscú: Radio i svjaz (Радио и связь).
Baykov, Vladimir D.; Smolov, Vladimir B. (1985). Специализированные процессоры: итерационные algoritmы и структуры [ Procesadores de propósito especial: estructuras y algoritmos iterativos ] (en ruso). Moscú: Radio i svjaz (Радио и связь).
Coppens, Thomas, ed. (enero de 1980). "Constantes CORDIC en la ROM TI 58/59". Boletín de noticias de Texas Instruments Software Exchange . 2 (2). Kapellen, Bélgica: TISOFT.
Coppens, Thomas, ed. (abril-junio de 1980). "Esquema de cálculo del logaritmo natural / esquema de cálculo e x / esquema de cálculo 1/x". Boletín de noticias de Texas Instruments Software Exchange . 2 (3). Kapellen, Bélgica: TISOFT.(sobre CORDIC en TI-58 / TI-59 )
Equipo de productos gráficos de TI (1995) [1993]. "Algoritmos de funciones trascendentales". Dallas, Texas, EE. UU.: Texas Instruments , Consumer Products. Archivado desde el original el 17 de marzo de 2016. Consultado el 2 de marzo de 2019 .
Jorke, Günter; Lampe, Bernhard; Wengel, Norberto (1989). Arithmetische Algorithmen der Mikrorechentechnik (en alemán) (1 ed.). Berlín, Alemania: VEB Verlag Technik. págs. 219, 261, 271–296. ISBN 3341005153. EAN 9783341005156. MPN 5539165. Licencia 201.370/4/89 . Consultado el 1 de diciembre de 2015 .
Zechmeister, M. (2021). "Resolver la ecuación de Kepler con dobles iteraciones CORDIC". Avisos mensuales de la Real Sociedad Astronómica . 500 (1). Göttingen, Alemania: Institut für Astrophysik, Georg-August-Universität: 109–117. arXiv : 2008.02894 . doi : 10.1093/mnras/staa2441 .
Frerking, Marvin E. (1994). Procesamiento de señales digitales en sistemas de comunicación (1.ª ed.).
Kantabutra, Vitit (1996). "Sobre hardware para calcular funciones exponenciales y trigonométricas". IEEE Transactions on Computers . 45 (3): 328–339. doi :10.1109/12.485571.
Johansson, Kenny (2008). "6.5 Funciones seno y coseno". Cálculos basados en desplazamiento y suma de baja potencia y baja complejidad (PDF) (Tesis de disertación). Linköping Studies in Science and Technology (1.ª ed.). Linköping, Suecia: Departamento de Ingeniería Eléctrica, Universidad de Linköping . pp. 244–250. ISBN 978-91-7393-836-5. ISSN 0345-7524. Núm. 1201. Archivado (PDF) desde el original el 13 de agosto de 2017. Consultado el 23 de agosto de 2021 .(x+268 páginas)
Banerjee, Ayan (2001). "Realización FPGA de un procesador FFT basado en CORDIC para procesamiento de señales biomédicas". Microprocesadores y microsistemas . 25 (3). Kharagpur, Bengala Occidental, India: 131–142. doi :10.1016/S0141-9331(01)00106-5.
Kahan, William Morton (2002-05-20). "Algoritmos de pseudodivisión para logaritmos de coma flotante y exponenciales" (PDF) . Berkeley, CA, EE. UU.: Universidad de California . Archivado desde el original (PDF) el 25 de diciembre de 2015 . Consultado el 15 de enero de 2016 .
Cockrum, Chris K. (otoño de 2008). "Implementación de un algoritmo CORDIC en un convertidor descendente digital" (PDF) .
Lakshmi, Boppana; Dhar, Anindya Sundar (6 de octubre de 2009). "Arquitecturas CORDIC: una encuesta". Diseño VLSI . 2010 . Kharagpur, Bengala Occidental, India: Departamento de Ingeniería Electrónica y de Comunicaciones Eléctricas, Instituto Indio de Tecnología (publicado el 10 de octubre de 2010): 1–19. doi : 10.1155/2010/794891 . 794891.
Savard, John JG (2018) [2006]. «Técnicas aritméticas avanzadas». quadibloc . Archivado desde el original el 2018-07-03 . Consultado el 2018-07-16 .
Enlaces externos
Wikiversidad tiene recursos de aprendizaje sobre implementaciones de hardware CORDIC
Wang, Shaoyun (julio de 2011), Sitio de bibliografía de CORDIC, archivado desde el original el 17 de octubre de 2000 – vía Chandra Department of Electric and Computer Engineering, Cockrell School of Engineering, The University of Texas at Austin
IP de Soft CORDIC (código HDL de Verilog)
Sitio de bibliografía de CORDIC
BASIC Stamp, implementación matemática CORDIC
Implementación de CORDIC en Verilog
Vectorización CORDIC con valor objetivo arbitrario
Implementación de CORDIC en Python
Código C simple para CORDIC de punto fijo
Tutorial e implementación de MATLAB: uso de CORDIC para estimar la fase de un número complejo (archive.org)
Descripciones de hardware CORDICs en Arx con bancos de pruebas en C++ y VHDL
Introducción al algoritmo CORDIC
Implementación del algoritmo CORDIC en un convertidor reductor digital
Implementación del algoritmo CORDIC: código C de punto fijo para funciones trigonométricas e hiperbólicas, código C para pruebas y verificación de rendimiento