Casa > C > Como É Que Uma Calculadora Encontra O Valor Do Cosseno De Um Ângulo? Acaba De Ser Guardado Na Calculadora?

Como é que uma calculadora encontra o valor do cosseno de um ângulo? Acaba de ser guardado na calculadora?

Sim, algumas calculadoras podem estar usando uma tabela de pesquisa para obter a resposta, ou pelo menos parte dela.

Mas o cosseno pode ser calculado com precisão crescente calculando e somando mais e mais termos de sua série Taylor

main-qimg-4ab458db420ee290906af0af848dbd94

>>br> Fiz um pequeno gráfico mostrando as primeiras iterações da aplicação desta série:

main-qimg-784fbf8972570595c29f67429ac3caf1.webp

>>br> Este é um co-seno centrado na origem. A linha preta pontilhada é um co-seno real.

red = 1 iteração (max k = 0)
green = 2 iterações (max k = 1)
blue = 3 iterações (max k = 2)
magenta = 4 iterações (max k = 3)
cyan = 5 iterações (max k = 4)

Como se pode ver, está cada vez mais próximo do valor real do co-seno. If we carried it on to infinity it would exactly match.

But you can see, even after just a handful of iterations, it is very closely matching the real shape up to where it first crosses the x-axis (where x = pi/2). And that's all we need, because the rest of the wave can be constructed by reversing it (horizontally and vertically), which is very easily done in code.

I would guess that the first few values of ((-1)^k)/(2k)! are stored in a lookup table for optimisation.

Edit: Okay, I got interested in the challenge and wrote a little cosine function of my own, using the taylor expansion.

  1. int NUM_ITERATIONS = 3;  
  2. float[] LUT = new float[NUM_ITERATIONS]; 
  3.  
  4. int factorial(int k) {  
  5. int f = 1;  
  6. k++;  
  7. while (k-->1) f *= k;  
  8. return f; 
  9.  
  10. void setupLUT() {  
  11. for (int k=0; k
  12. LUT[k] = pow(-1.0,k) / factorial(k*2); 
  13.  
  14. float taylorSeries(float x) {  
  15. float f = 0;  
  16. for (int k=0; k
  17. f += pow(x,k*2.0) * LUT[k];  
  18. return f; 
  19.  
  20. float myCosine(float x) { 
  21. x = abs(x) % TWO_PI; 
  22. if ( x>PI ) x = TWO_PI-x; 
  23. return (x

It's surprisingly accurate, even with only 3 iterations:

main-qimg-df23380a5c17dc1dc2fcd752eda51105.webp

De Elianore

Como configurar tiras de luz LED para o seu quarto :: Quais são os departamentos de uma empresa fabricante, e o que eles fazem?