Question

Je dois créer la fonction péché à partir de zéro dans ma classe Comp Sci et je suis sur le point de trouver une solution. Cependant, j'ai encore quelques problèmes. Si je mets une valeur de .5PI ou moins cela fonctionne, mais sinon, j'obtiens un résultat incorrect. Voici le code que j'ai jusqu'à présent:

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++;
}
Était-ce utile?

La solution

Comme l’a souligné Federico, le problème réside probablement dans votre factorial () ou votre pow (). J'ai effectué un test qui a bien fonctionné, remplaçant vos fonctions par la fonction pow () fournie dans la classe Math, et ce 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);
} 

Autres conseils

Quelques conseils:

  • Commencez par term = 0. L'extension canonique MacLaurin ne le fait aussi
  • calculez les pouvoirs et la factorielle pendant que vous pédalez (c’est-à-dire, mettez-les à jour à chaque étape). Peut-être que le problème est dans pow () ou factorial ().

EDIT. Suggestion: une fois que vous avez calculé le k-ième terme, vous pouvez calculer le (k + 1)-ème par:

  • Multiplier par (-1)
  • Multiplier par sinOf ^ 2
  • Division par (2k + 2) (2k + 3)

De cette manière, vous pouvez complètement éviter le calcul des puissances et des factorielles.

En ce qui concerne les valeurs autres que 0 - 1 / 2PI, elles peuvent toutes être calculées à partir de valeurs situées dans la plage.

// 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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top