Pregunta

Tengo que crear la función pecado desde cero en mi clase Comp Sci, y me estoy acercando a una solución. Sin embargo, todavía estoy teniendo algunos problemas. Si pongo un valor de .5PI o menos, funciona, pero de lo contrario obtengo el resultado incorrecto. Aquí está el código que tengo hasta ahora:

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++;
}
¿Fue útil?

Solución

Como señaló Federico, el problema probablemente está en tu factorial () o pow (). Corrí una prueba que funcionó bien reemplazando sus funciones con la función pow () proporcionada en la clase de Matemáticas, y este 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);
} 

Otros consejos

Algunos consejos:

  • Comience con el término = 0. La expansión canónica de MacLaurin también lo hace
  • calcule los poderes y el factorial mientras realiza un ciclo (es decir, actualícelos en cada paso). Quizás el problema esté dentro de pow () o factorial ().

EDITAR. Sugerencia: una vez que haya calculado el término k-th, puede calcular el (k + 1) -th uno por:

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

De esta manera, puede evitar por completo el cálculo de potencias y factoriales.

En cuanto a los valores fuera de 0 - 1 / 2PI, todos se pueden calcular a partir de valores dentro del rango.

// 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top