Pergunta

Eu tenho que criar a função sin a partir do zero na minha classe Comp Sci, e eu estou chegando perto de uma solução. No entanto, eu ainda estou tendo alguns problemas. Se eu colocar em um valor de .5PI ou menos ele funciona, mas por outro lado eu recebo o resultado incorreto. Aqui está o código que eu tenho até agora:

double i=1;
double sinSoFar = 0;
int term = 1;
while(i >= .000001)
{
    i = pow(-1, term + 1) * pow(sinOf, 2*term-1) / factorial(2*term-1);
    sinSoFar=sinSoFar + i;
    term++;
}
Foi útil?

Solução

Como Federico apontou, o problema provavelmente está na sua factorial () ou pow (). Corri um teste que funcionou bem substituindo suas funções com a função pow () fornecido na aula de matemática, e isso factorial ():

public static long factorial(long n) {
        if      (n <  0) throw new RuntimeException("Underflow error in factorial");
        else if (n > 20) throw new RuntimeException("Overflow error in factorial");
        else if (n == 0) return 1;
        else             return n * factorial(n-1);
} 

Outras dicas

Alguns conselhos:

  • Comece com prazo = 0. A expansão MacLaurin canônica também faz
  • calcular os poderes e o fatorial enquanto você está de bicicleta (isto é, atualizá-los em cada etapa). Talvez o problema está dentro de pow () ou factorial ().

EDIT. Sugestão: depois de ter calculado o k-th prazo, você pode calcular o (k + 1) um -ésimo por:

  • Multiplicando por (-1)
  • Multiplicando por sinOf ^ 2
  • Dividindo por (2k + 2) (2k + 3)

Desta forma, você pode completamente evitar o cálculo de poderes e fatoriais.

Quanto valores fora do 0 -. 1 / 2PI, todos eles podem ser calculados a partir de valores dentro da faixa

// First, normalize argument angle (ang) to -PI to PI, 
// by adding/subtracting 2*PI until it's within range
if ( ang > 1/2PI ) {
    sin = sin ( PI - ang );
}
else if ( ang < 0 ) {
    sin = -1 * sin( -1 * ang );
}
else {
    // your original code
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top