Domanda

Devo creare la funzione sin da zero nella mia classe Comp Sci e mi sto avvicinando a una soluzione. Tuttavia, sto ancora riscontrando alcuni problemi. Se inserisco un valore di .5PI o meno funziona, ma in caso contrario ottengo il risultato errato. Ecco il codice che ho finora:

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++;
}
È stato utile?

Soluzione

Come ha sottolineato Federico, il problema probabilmente è nel tuo factorial () o pow (). Ho eseguito un test che ha funzionato perfettamente sostituendo le tue funzioni con la funzione pow () fornita nella classe Math e questo fattoriale ():

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);
} 

Altri suggerimenti

Alcuni consigli:

  • Inizia con termine = 0. Anche l'espansione canonica di MacLaurin
  • calcola i poteri e il fattoriale mentre pedali (cioè aggiornandoli ad ogni passo). Forse il problema è all'interno di pow () o factorial ().

EDIT. Suggerimento: una volta calcolato il k-esimo termine, è possibile calcolare il (k + 1) -esimo per:

  • Moltiplicando per (-1)
  • Moltiplicare per sinOf ^ 2
  • Divisione per (2k + 2) (2k + 3)

In questo modo puoi evitare completamente il calcolo di poteri e fattoriali.

Per quanto riguarda i valori al di fuori di 0 - 1 / 2PI, possono essere tutti calcolati da valori all'interno dell'intervallo.

// 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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top