Quiero calcular y(n)=32677Sin(45/1024•n)
, dónde y
es un número entero y n
varía de 0 a 2048. ¿Cómo puedo hacer este proceso más rápido y con mayor precisión? Ahora quiero mostrarle una respuesta de referencia: desde Sin(a+b)=Sin(a)Cos(b)+Cos(a)Sin(b)
And Cos(a+b)=Cos(a)Cos(b)-Sin(a)Cos(b)
. Entonces puedo almacenar Sin(45/1024•1)
y solo. Cos(45/1024•1)
Luego use esta fórmula:
Sin(45/1024•2)=Sin(45/1024•1+45/1024•1)
,
Cos(45/1024•2)=Cos(45/1024•1+45/1024•1)
,
Sin(45/1024•n)=Sin(45/1024•(n-1)+45/1024•1)
,
Cos(45/1024•n)=Cos(45/1024•(n-1)+45/1024•1)
, De esta manera tal vez más rápido sin almacenar gran variedad.
c++
algorithms
LaiJong
fuente
fuente
sin(x)
dóndex
está en grados. Si ese es el caso, debe tener en cuenta que el argumento de las funciones trigonométricas generalmente está en radianes. El argumento está en radianes en C ++, que es cómo se etiqueta esta pregunta.Respuestas:
Si el
n
rango va de 0 a 2048, puede calcular previamente los valores, almacenarlos en una matriz.y(n)
se convertiríavalues[n]
.fuente
fsin
podrían usarse y ser más amigables con la caché que algunas matrices).Calcule la tabla en tiempo de compilación en lugar de tiempo de ejecución.
Estás haciendo una tabla de 2048 elementos de valores enteros escalados de 16 bits.
Escriba un script Matlab barato, con una impresión que proporcione una línea de datos adecuada para su lenguaje de programación final. Corte y pegue el resultado en su código fuente, como una tabla de datos constante, y realice una búsqueda de tabla en tiempo de ejecución. Esto empuja el tiempo de cálculo inicial al ciclo de compilación, en lugar del tiempo de inicio del programa.
fuente
Dada la forma de la función, la respuesta natural es el algoritmo CORDIC . Es un enfoque mucho más limpio que el desglose de la pregunta. Por otro lado, la tabla que necesita es mucho, mucho más pequeña que la tabla que otros han sugerido.
fuente