Frage

muss ich die sin-Funktion von Grund auf in meinem Comp Sci-Klasse erstellen, und ich bin immer nah an einer Lösung. Aber ich habe immer noch ein paar Probleme. Wenn ich in einem Wert von .5PI setzen oder weniger es funktioniert, aber sonst habe ich das falsche Ergebnis. Hier ist der Code Ich habe so weit:

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++;
}
War es hilfreich?

Lösung

Wie Federico zeigte, ist das Problem wahrscheinlich in Ihrem Fakultäts () oder pow (). Ich lief einen Test, der gut funktionierte Ihre Funktionen mit der Funktion pow () in der Math-Klasse ersetzt, und diese faktorielles ():

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

Andere Tipps

Einige Hinweise:

  • Starten Sie mit dem Begriff = 0. Die kanonische MacLaurin Expansion auch tut
  • die Kräfte berechnen und die Fakultäts , während Sie Radfahren (das heißt, sie bei jedem Schritt der Aktualisierung). Vielleicht ist das Problem innerhalb von pow () oder faktorielle ().

EDIT. Vorschlag: sobald Sie die k-te Term berechnet haben, können Sie den (k + 1) -te berechnen eins nach:

  • Multipliziert mit (-1)
  • Multipliziert man durch sinOf ^ 2
  • Dividing von (2k + 2) (2k + 3)

Auf diese Weise können Sie ganz vermeiden die Berechnung der Kräfte und factorials.

Soweit Werte außerhalb von 0 -. 1 / 2PI, sie können alle von Werten innerhalb des Bereichs berechnet werden

// 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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top