Sinus von Hand berechnen, Probleme beim realisieren



  • Ok dann ist klar 🙂



  • Das folgende geht leider nicht, nur bei 1.0 😞
    Fiel mir erst eben auf.

    // Sinus
    	public double sin(double x, int n) {
        	double result = x;
      		int ToggleSign = 0;
    
      		int i = 3;
      		do {
        		ToggleSign ^= 1;
        		result += pow(x, i)/fac(i) * ((ToggleSign == 1)? -1.0 : +1.0);
        		System.out.println ("Result ("+i+")" + result);
        		System.out.println ("Fakultät von i " + fac(i));
        		System.out.println ("Potenz von pow(x,i)" + pow(x,i));
        		System.out.println ("i " + i);
        		System.out.println ("ToggleSign " +ToggleSign);
        		System.out.println ("----");
        		i+=2;
      		}while( (--n != 0) ); // solange Anzahl nicht null ist
    
      		return result;
    	}
    

    Aber das ist doch richtig :???:



  • Mit folgendem C++ Programm geht es, Java hat keinen groß genugen Wertebereich,
    nehm ich mal an.

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    long double fac (long double i) {
     return i > 1 ? i *= fac (i-1) : i;
    }
    
    long double sinus(double x, int n) {
    	long double result = x;
      	int ToggleSign = 0;
    
    	int i = 3;
    	do {
    		ToggleSign ^= 1;
        		result += pow(x, i)/fac(i) * ((ToggleSign == 1) ? -1.0 : +1.0);
        		i+=2;
      	}while( (--n != 0) ); // solange Anzahl nicht null ist
    
    	return result;
    }
    
    int main () {
    
     long double eingabe;
     cin >> eingabe;
    
     cout << "sinus eigene " << sinus (eingabe, 8) << endl;
     cout << "sinus lib " << sin (eingabe) << endl;
     cin >> eingabe;
     return 0;
    }
    


  • Sind jetzt leider 4Postings von mir in Folge,aber durchs editieren würde es nur
    unübersichtlich werden.
    Konnte in der Schule nicht in Ruhe posten, jetzt nochmal alles ganz ausfürhlich.

    Das Programm funktioniert mit C++ perfekt, auch ohne long double, ein einfacher
    double genügt, unter Java erhalte ich jedoch nach wenigen Iterationen über die
    fakultät und die pow-Funktion ein "infinity", c++ packt auch noch 8 für n bei
    der sin-funktion, Java nichtmal 4 wenn ich den Sinus von 2 wissen will.
    Die Ergebnisse des Programmes stimmen bei C++ exakt mit denen der cmath sinus-funktion
    überein.
    Und denen der Sinus-Funktion der Java Math-Lib.

    Das Problem ist also etwas Java-spezifisches, das ich nicht kenne (Operatorreihenfolge kann es eigentlich nicht sein, habe schon einklammern versucht).
    Da die Wertebereiche gleich sind ist mir das "infinity" in Java was in C++
    ausbleibt (würde der Wertebereich überschritten, könnte das Ergebnis ja nicht
    mehr stimmen).

    Ist hier zufällig ein Java-Experte unter uns der auch C++ kann?
    Vllt. kann man den Thread ja auch ins Java-Forum verschieben, falls mir hier keiner
    helfen kann.



  • Verwende unter Java doch einfach mal die Klasse BigDecimal.



  • Habe das ganze jetzt mal versucht so zu lösen, aber das Problem ist wohl, dass ich
    für BigDecimal einen double zum konstruiren brauche, bekomme hier ebenfalls
    falsche Ergebnisse.
    Verstehe das aber nicht, double ist in c++ und java doch gleich groß 😕

    public BigDecimal sin(double x, int n) {
        	BigDecimal result = new BigDecimal (x);
      		int ToggleSign = 0;
    
    		int i = 3;
    		do {
    			ToggleSign ^= 1;
        		result.add (new BigDecimal(pow(x, i)/fac(i) * ((ToggleSign == 1) ? -1.0 : +1.0)));
        		i+=2;
      		}while( (--n != 0) ); // solange Anzahl nicht null ist
    
    		return result;
    	}
    

Anmelden zum Antworten