Taylor Reihe cos(x)

Hi,

ich habe folgendes Problem:

Mein Prof hat mir die Aufgabe gestellt eine Methode zur Cosinus Funktion zu schreiben, welche die Berechnung abbricht, sobald der Summand nur noch an der 8. Stelle verändert wird.
Dabei soll ich den Cosinus der Werte (0,-1,1,1000) ausgeben.
Mit 0,-1 und 1 funktioniert auch alles wunder bar, auch 2 geht, doch bei allem darüber geht nichts mehr und das Programm gibt ab der Ausgabe des letzten funktionierenden Ergenisses nichts mehr aus, auch keine folgenden System.out Ausgaben.

Kann da einer von euch mal drüberschauen? Ich bin da echt am verzweifeln.


Code:
public class cosinustest3 {

	/**
	 * @param args
	 */
	public static double EPSILON = 1E-8;
	
	//Fakultät
	public static long Fakultaet(int max) 
	{
		long fakultaet = 1;
 
		for (int x = 1; x <= max; x++) {
			fakultaet = fakultaet * x;
		}
		return fakultaet;
	}
	
	//Cosinusberechnung
	public static float cosinus(float x, int n)
	{
		float result = 0;
		double z = 0;
 
		for (int i = 0; i <= n; i++)
		{
			z = ( (Math.pow(x, (float)2*i))/(float)Fakultaet(2*i)) * Math.pow((float)-1, (float)i);
			result += z;
		} while (Math.abs(z) > EPSILON);
		
		
		return result;
 
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//Ausgabe der Ergebnisse
		// Cosinus nach Berechnung
		System.out.println("Berechnung");
		System.out.println("cos(0) = " + cosinus(0,8));
		System.out.println("cos(1) = " + cosinus(1,8));
		System.out.println("cos(-1) = " + cosinus(-1,8));
		System.out.println("cos(2) = " + cosinus(2,8));
		System.out.println("cos(1000) = funktioniert nicht (System hängt sich auf)" ); // cos(0,-1,1,2) funktionieren, bei allem darüber hängt sich das System auf.
		
		// Vergleich mit den Ergebnissen der in Java eingebauten Cosinus Methode
		// Cosinus Math.cos
		System.out.println("Vergl. mit Math.cos");
		System.out.println("cos(0) = " + Math.cos(0));
		System.out.println("cos(1) = " + Math.cos(1));
		System.out.println("cos(-1) = " + Math.cos(-1));
		System.out.println("cos(2) = " + Math.cos(2));
		System.out.println("cos(1000) = " + Math.cos(1000));
		
	}

}
 

Anhänge

Zuletzt bearbeitet:
Hey,
wenn du das Problem gelöst hast, wäre es schön, wenn du deine Lösung noch schreibst und das Thema anschließend als erledigt markierst. Danke :)

Gruß

Fabio
 
@freizeitpsychologe: Es wäre wirklich nett, wenn du dich noch einmal meldest.
Ins Blaue hinein geraten: War das Radiant-System dein Problem? Mit %2Pi?

@Evolox:
Willkommen bei tutorials.de :)

Poste bitte einmal deinen aktuellen Code.
 
Java:
public class ProgrammCos {
	public static double EPSILON = 1E-8;

	 
		static long factorial(int max) {
			long fakultaet = 1;
	 
			for (int zahl=1; zahl<=max; zahl++) {
				fakultaet = fakultaet * zahl;
			}
			return fakultaet;
		}

	static float cos(float x) {		
		if(x > 3f) {									
			System.out.println("Infinity");
			return 0.0f;
		};
		double result = 0.0;
		int n = -1;
		double cos = 0.0;		
		do {
		cos = Math.pow(-1,n+3) * Math.pow(x,2*n+2) / factorial(2*n+2);
		result += cos;
		n += 1;
		} while (Math.abs(cos) >= EPSILON);  //Terminationsbedingung
		return (float) result;
		}


	public static void main(String[] args) {
		System.out.println("cos(0)=" + cos(0));
		System.out.println("cos(1)=" + cos(1));
		System.out.println("cos(-1)=" + cos(-1));
		System.out.println("cos(1000)=" + cos(1000));  <= hier hängt es	
		System.out.println("Math.cos(0)=" + Math.cos(0));              
		System.out.println("Math.cos(1)=" + Math.cos(1));
		System.out.println("Math.cos(-1)=" + Math.cos(-1));
		System.out.println("Math.cos(1000)=" + Math.cos(1000));
	}

}

also bis 3 kann der cosinus berechnet werden, aber bei allen zahlen die darüber hinaus gehen hängt sich das programm auf, darum habe ich auch die if bedingung dort eingebracht
 
Zuletzt bearbeitet von einem Moderator:
In Zukunft bitte die Codetags (siehe Signatur) verwenden...
den Effekt siehst du ja.

Und zum Fehler...
das Selbe.
Euch scheint allen nicht bewusst zu sein, dass die Taylor-Formeln
ihr x im Bogenmaß/Radiant/wie auch immer haben wollen.

360° sind also 6.28, also zwei mal PI.
90° wäre entsprechend PI/2 usw.

Um die Wertwiederholung mit einzubeziehen:
Statt
C++:
if(x > 3f) {                                    
    System.out.println("Infinity");
    return 0.0f;
};
das:
C++:
x = x % 6.28318531;
if(x < 0.0)
    x = 6.28318531 - x;

Alle float durch double ersetzen ist übrigens in dem Fall kein Nachteil.

Gruß
 
Ahh alles klar, sehr gut jetzt wird mir einiges klarer. Danke. Aber irgendwie klappt es immer noch nicht. Das Programm bleibt immernoch bei Werten über 3 hängen und jetzt auch bei negativen Werten.
 
Zurück