# Taylor Reihe cos(x)



## freizeit-psychologe (4. November 2011)

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.



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

}
```


----------



## freizeit-psychologe (4. November 2011)

Sry, hat sich gerade eben erledigt. Habe den Fehler behoben.


----------



## Fabio Hellmann (4. November 2011)

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


----------



## Evolox (5. November 2011)

Ich habe genau das gleiche Problem. Ich hoffe mir kann da jemand helfen.

mfg
Evolox


----------



## sheel (5. November 2011)

@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.


----------



## Evolox (6. November 2011)

```
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


----------



## sheel (6. November 2011)

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

```
if(x > 3f) {                                    
    System.out.println("Infinity");
    return 0.0f;
};
```
das:

```
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ß


----------



## Evolox (6. November 2011)

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.


----------

