2016-12-09 3 views
0

Ich wurde gebeten, die cos nach dieser Gleichung zu finden:Finden der cos eines Winkels in Java

konnte ich die Sünde der Winkel finden, aber wenn die cos finden, die Nummer, die ich bekommen würde, ist ganz anders als der richtige Wert:

Ich habe den folgenden Code für die Suche nach dem cos verwendet. ps: Ich kann nicht math.cos

cosine expression

public static double cos(double x, int n){ 

    // declaring cos and factorial 

    double cos = 0.0; 


    // this loop determines how long does the loop go so the answer is more accurate 
    for (long howlong = 1 ; howlong <=n; howlong++){ 
     double factorial =1; 

    // this will calculate the factorial for even numbers ex/ 2*2 = 4 , 4-2 = 2 
    // for the denominator 

    for (int factorialnumber=1; factorialnumber<=2*howlong-2; factorialnumber++){ 
     factorial = factorial * howlong;  

    } 

    // now we need to create the pattern for the + and - 
    // so we use % that switches the sign everytime i increments by 1 

    if (howlong%2==1){ 
     cos = cos + (double) (Math.pow(x, 2*howlong-2)/factorial); 
    } 

    else{ 
     cos = cos - (double) (Math.pow(x, 2*howlong-2)/factorial); 
    } 
    } 
    return cos; 
} 

bearbeiten verwenden: ich meinen Fehler herausgefunden, wie es die Fakultät, wie lange statt faktorielles Zahl multipliziert wurde.

+0

Wir wissen nicht, was Ihre Eingabe, erwartete Ausgabe oder tatsächliche Leistung ist, was es schwieriger macht, Ihnen zu helfen. (Es könnte z. B. leicht ein Grad-gegen-Radiant-Problem sein.) –

+0

Sie verlieren die Präzision, indem Sie ein "double" für Ihre Fakultät verwenden. – jsheeran

+0

Entschuldigung ich löschte es von mkstake, ich fügte es zurück – khbq

Antwort

1

Sie haben zwei Fehler.

(Bug 1) Wo Sie

factorial = factorial * howlong; 

geschrieben hätte es

gewesen
factorial = factorial * factorialnumber; 

(Bug 2) Sie Ihre factorials bei jeder Iteration durch die äußere nicht Zurücksetzen Schleife. Sie müssen also die Linie

ein paar Zeilen nach unten verschieben, so dass es innerhalb der äußeren Schleife ist. Wenn Sie diese beiden Änderungen vornehmen, ist das Ergebnis von cos(Math.PI/6, 10)0.8660254037844386, was mir richtig erscheint.

+0

Vielen Dank es scheint zu funktionieren, ohne die Fakultät zu bewegen. – khbq

+0

aber wo sollte ich es bewegen, aus welcher Schleife? – khbq

+0

Genau wie gesagt. Bewegen Sie 'double factorial = 1;' so dass es nur innerhalb der äußeren Schleife liegt. Sie müssen dies tun, sonst lautet Ihre Antwort "0.8644874260241855", was _close_ ist, aber falsch. –

-1

Ihre Berechnung ist nicht korrekt, ändern Sie bitte

double value = 1; 
      for (int factorialnumber = 1; factorialnumber <= 2 * howlong - 2; factorialnumber++) { 
       value = factorialnumber * value; 
      } 

      factorial = value; 
      System.out.println(value + " " + (2 * howlong - 2)); 
+0

Hast du das getestet? Ich glaube, es funktioniert nicht. –

+0

@DavidWallace Ich habe 0.8998780704734082, die ziemlich nah ist – nomadus

+0

Nein, es ist nicht ganz in der Nähe. 10 Terme sollten ausreichen, um Sie innerhalb der Genauigkeit einer doppelten Genauigkeitszahl zum wahren Kosinus zu bringen, die "sqrt (3)/2" oder "0.8660254037844386" ist. Sie sind um mehr als 3% ausgelaufen (ungefähr halb so viel wie das ursprüngliche Programm von OP), also ist Ihr Algorithmus falsch. –

0

Die Berechnung Ihrer Fakultät war falsch. Versuchen Sie es mit diesem Code:

public static double cos(double x, int n) { 

    // declaring cos and factorial 

    double cos = 0.0; 


    // this loop determines how long does the loop go so the answer is more 
    // accurate 
    for (long howlong = 1; howlong <= n; howlong++) { 

     // now we need to create the pattern for the + and - 
     // so we use % that switches the sign everytime i increments by 1 

     if (howlong % 2 == 1) { 
      cos = cos + Math.pow(x, 2 * howlong - 2)/factorial(2 * howlong - 2); 
     } 

     else { 
      cos = cos - Math.pow(x, 2 * howlong - 2)/factorial(2 * howlong - 2); 
     } 
    } 
    return cos; 
} 

public static long factorial(long n) { 
    long result = 1; 
    for (int i = 2; i <= n; i++) { 
     result *= i; 
    } 
    return result; 
} 
+0

P.S .: Ich testete es :-) –

+0

Ja, diese Antwort ist richtig. Es gibt fast immer mehr als eine Möglichkeit, diese Dinge zu tun. –

Verwandte Themen