Java sinus berechnen

Split1989

hh-student.de
ID: 238425
L
9 April 2007
1.223
85
Moin leute

versuche den sinuswert zu berechnen ohne Math.sin() zu benutzen.

für kleine werte funktioniert es auch aber bei großen scheint irgendwo ein überlauf oder so zu sein, aufjedenfall stimmen dann die werte nicht. findet ihr evtl den fehler?

Code:
public static double fac(double zahl){
        double erg = 1;
        double n = zahl;
        while(n >= 1){
            erg = erg*n;
            n-=1;
        }
        return erg;
    }
    
    public static double sinReihe(double zahl){
        double old = 1.0;
        double neu = 0.0;
        double bruch = 0.0;
        double i = 0;
        double exp = 0.0;
        System.out.println();
        // Math.abs Math.abs() liefert doppelte genauigkeit (16 stellen) //
        while (Math.abs(old - neu) != 0){
            old = neu;
            exp = (i*2)+1;
            //##    VORZEICHEN  ## ## x^(1,3,5,7...)      /  (1,3,5,7,...)!  ##//   
            bruch = Math.pow(-1,i)*((Math.pow(zahl,exp))/fac(exp));
            neu = old + bruch;
            i++;
        }
        System.out.println("durchgänge:"+i);
        return neu; 
    }
 
So n Sinus wiederholt sich doch ... 0-2pi. Wenn es in diesem Bereich läuft, könntest alles über 2pi runter bringen und alles unter 0 hoch schieben, in dem du so lang 2pi addierst/subtrahierst, bis es zwischen 0 und 2pi ist.

Wenn es schon für 0-2pi nicht funktioniert, dann weiss ich auch nich weiter.
 
Muß es unbedingt 'ne Reihenentwicklung sein? Sonst einfach durch die Hintertür: sin^2 (x) + cos^2 (x) = 1
 
@apolle
ne muss leider schon nach dem schema geschehen

@SerkanB
danke,der tipp mit den 2pi brachte schlussendlich die erwünschte lösung

Code:
public static double sinReihe(double zahl){
    	zahl = zahl%(2*Math.PI);
        double bruch = zahl;
        double erg = zahl;

        System.out.println();
        int n= 0;
        for(int i=1;erg+bruch != erg; i++){

            bruch = bruch*(Math.pow(zahl,2)/((2*i)*(2*i+1)));
            erg += Math.pow(-1,i)*bruch;
            n++;
        }
        System.out.println("durchgänge:"+n);
        return erg; 
 }
 
Zuletzt bearbeitet: