2012-02-13 41 views
6

Estoy tratando de implementar las funciones de coseno y seno en coma flotante (pero no tengo hardware de coma flotante).Coseno en coma flotante

Como mi procesador no tiene hardware de punto flotante ni instrucciones, ya he implementado algoritmos para multiplicación de coma flotante, división, suma, resta y raíz cuadrada. Estas son las herramientas que tengo a mi disposición para implementar el coseno y el seno.

Estaba considerando utilizar el método CORDIC, at this site Sin embargo, implementé la división y la raíz cuadrada usando el método de Newton, así que esperaba usar el método más eficiente.

Por favor, no me digan que vaya a buscar en un libro o que "el papel existe", no es una broma que existan. Estoy buscando nombres de algoritmos bien conocidos que se sabe que son rápidos y eficientes.

+1

¿No puede encontrar y adaptar una biblioteca matemática existente? ¡Porque los cálculos debajo de ellos son bastante complejos! Escribir una biblioteca de matemáticas competitiva puede merecer un doctorado (y necesitaría años de esfuerzos). –

+0

No soy realmente un adicto al código, solo me gustaría el algoritmo y puedo hacer la implementación yo mismo. Tengo que reescribir el código en el ensamble yo mismo y programarlo también. (Es para un procesador personalizado). – Veridian

+0

Creo que hay muchos libros y trabajos sobre ese tema. ¿Fuiste a una biblioteca de la universidad? –

Respuesta

4

En primer lugar, dependiendo de sus requisitos de precisión, esto puede ser considerablemente más complicado que sus preguntas anteriores.

Ahora que ha sido advertido: primero querrá reducir el argumento módulo pi/2 (o 2pi, o pi, o pi/4) para obtener la entrada en un rango manejable. Esta es la parte sutil. Para una buena discusión de los problemas involucrados, descargue una copia de K.C. Ng. REDUCCIÓN DE ARGUMENTOS PARA GRANDES ARGUMENTOS: Bueno hasta el último bit. (Búsqueda simple de google en el título te dará un pdf). Es muy legible y hace un gran trabajo al describir por qué esto es complicado.

Después de hacer eso, solo necesita aproximar las funciones en un rango pequeño alrededor de cero, lo cual se hace fácilmente mediante una aproximación polinómica. Una serie de Taylor funcionará, aunque es ineficiente. Una serie chebyshev truncada es fácil de calcular y razonablemente eficiente; calcular la aproximación minimax es mejor aún. Esta es la parte facil.

He implementado el seno y el coseno exactamente como se describe, totalmente en número entero, en el pasado (lo siento, no hay fuentes públicas). Usando ensambles ajustados a mano, los resultados en la vecindad de 100 ciclos son completamente razonables en procesadores "típicos". No sé a qué hardware se enfrenta (el rendimiento se verá principalmente determinado por la rapidez con la que su hardware puede producir la mayor parte de un número entero multiplicado).

+0

@starbox: la aproximación de Minimax es una especie de arte negro. solo lo sabes realmente si necesitas usarlo. Puede comenzar buscando el "algoritmo de intercambio Remez", que es un enfoque estándar. Una serie truncada de Chebyshev es mucho más fácil de computar, y casi tan buena. Una serie taylor requerirá unos pocos términos más para ofrecer la misma precisión, pero es (obviamente) muy simple. –

+0

@starbox: También debo tener en cuenta que probablemente * no quiera * utilizar sus rutinas de multiplicación y adición de FP existentes (eso es demasiado caro). Mantener la mayor parte del cálculo en números enteros resulta ser más fácil en algunos aspectos, de todos modos. El procesador para el que escribí la implementación entera en realidad tenía una FPU, pero pude obtener el resultado más rápido sin usarlo. –

+1

@starbox: la razón para evitar el uso de operaciones de FP completas es que no necesita redondear cada paso del cálculo. Puede llevar un poco más de precisión y retrasar cualquier lógica de redondeo hasta el final. –

-1

Dado que tiene las operaciones aritméticas básicas implementadas, también puede implementar seno y coseno utilizando sus expansiones de series taylor.

+0

Sé que podría hacerlo, pero quiero un método que sea el más eficiente y el más rápido. Sé que algunos métodos usan una tabla de búsqueda, ¿cuáles son esos y son mucho más rápidos? – Veridian

+0

¿qué hay de la aproximación minimax? – Veridian

+0

lo siento, no estoy familiarizado con ningún algoritmo minimax – ardnew

1

Por diferentes niveles de precisión, se pueden encontrar algunas buenas aproximaciones aquí:

http://www.ganssle.com/approx.htm

Con la ventaja añadida de que son determinista en tiempo de ejecución a diferencia de las diversas opciones de "series convergentes", que pueden variar mucho dependiendo en el valor de entrada. Esto importa si está haciendo algo en tiempo real (juegos, control de movimiento, etc.)

Cuestiones relacionadas