Quero calcular y(n)=32677Sin(45/1024•n)
onde y
é um número inteiro e n
varia de 0 a 2048. Como posso tornar esse processo mais rápido e mais preciso? Agora, quero mostrar uma resposta de referência: Desde Sin(a+b)=Sin(a)Cos(b)+Cos(a)Sin(b)
And Cos(a+b)=Cos(a)Cos(b)-Sin(a)Cos(b)
. Para que eu possa armazenar Sin(45/1024•1)
e Cos(45/1024•1)
somente. Em seguida, 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)
, Desta forma, talvez mais rápido sem armazenar grande variedade.
c++
algorithms
LaiJong
fonte
fonte
sin(x)
ondex
está em graus. Se for esse o caso, você deve estar ciente de que o argumento para as funções trigonométricas é tipicamente em radianos. O argumento está em radianos em C ++, que é como essa pergunta é marcada.Respostas:
Se
n
varia de 0 a 2048, você pode pré-calcular os valores, armazenar em uma matriz.y(n)
se tornariavalues[n]
.fonte
fsin
podem ser usadas e mais amigáveis ao cache do que alguma matriz).Calcule a tabela no tempo de compilação em vez do tempo de execução.
Você está criando uma tabela de 2048 elementos de valores inteiros em escala de 16 bits.
Escreva um script Matlab barato, com uma impressão que ofereça uma linha de dados adequada para sua linguagem de programação final. Recorte e cole o resultado no seu código-fonte, como uma tabela de dados constante, e faça uma pesquisa de tabela no tempo de execução. Isso leva o tempo de computação inicial para o ciclo de construção, em vez do tempo de inicialização do programa.
fonte
Dada a forma da função, a resposta natural é o algoritmo CORDIC . É uma abordagem muito mais limpa do que a quebra na questão. Por outro lado, a tabela de que precisa é muito, muito menor do que a que outros sugeriram.
fonte