Absturz bei selbst geschriebener Sinus-Funktion



  • Hi Leute!
    Kann mir jemand helfen. Ich hab ne Sinus-Funktion geschrieben die die Maclaurin-Reihen benutzt. Jetzt bekomm ich aber beim Ausführen ne Fehlermeldung: irgendwas von Stack-Overflow
    Das ist mein Code

    #include<iostream>
    #include<cmath>
    using namespace std;
    
    #define GPI (3.1415926F) 
    #define GDeg2Rad(degree) ( (degree) * ( (GPI) / 180.F ) )
    
    inline float GSin(float f)
    {
    	float fTemp_3=f*f*f;
    	return( f>GPI
    			? GSin(f-2.F*GPI)
    			: f<GPI
    			  ? GSin(f+2.F*GPI)
    			  : (f - 0.0001984F*fTemp_3*fTemp_3*f + 0.0083333F*fTemp_3*f*f - 0.1666667F*fTemp_3) );
    }
    inline float GCos(float f)
    {	return( GSin(f+.5F*GPI) );}
    
    int main()
    {
    	float f;
    
    	cout<<"\n\nSinusberechnung"<<endl;
    	cout<<" Grad ="<<flush;
    	cin>>f;
    	while(f!=123.456789F)
    	{
    		cout.precision(10);
    		cout<<"GSin  ="<<GSin(GDeg2Rad(f))<<endl;
    		cout<<"sinf  ="<<sin(GDeg2Rad(f))<<endl;
    		cout<<" Zahl ="<<flush;
    		cin>>f;
    	}
    
    	cout<<"\n\nCosinusberechnung"<<endl;
    	cout<<" Grad ="<<flush;
    	cin>>f;
    	while(f!=123.456789F)
    	{
    		cout.precision(10);
    		cout<<"GCos  ="<<GCos(GDeg2Rad(f))<<endl;
    		cout<<"cosf  ="<<cos(GDeg2Rad(f))<<endl;
    		cout<<" Zahl ="<<flush;
    		cin>>f;
    	}
    	return(0);
    }
    

    Kann mir jemand helfen?



  • also, eine Reihe kann ich bei deinem code erstmal nicht erkennen.

    ein Stackoverflow kommt meist dann zustande, wenn man eine unendliche rekursion hat. Dies sieht mir bei dir auf den ersten blick aber auch nich so aus. Versuch als erstes mal deine ?-operatoren auszubauen und das mit if zu machen. Dann ersetz deine GSin(f-2pi) durch eine Schleife, die f solange reduziert bis f im richtigen bereich ist. Dann sollte es gehen.

    aber wie gesagt, eine reihe kannic h ncih erkennen 🙂



  • Das Abbruchkriterium der Rekursion ist effektiv f==GPI - und diesen Wert exakt zu treffen dürfte auf float-Ebene etwas schwierig werden. Außerdem sind deine Rekursions-Schritte so (sorry) miserabel gewählt, daß du auf der Stelle trittst:
    GSin(1.5)
    -> GSin(7.78...) (f+2GPI)
    -> GSin(1.5) (f-2
    GPI)
    ->...



  • Ich sehe nicht, wie deine Rekursion überhaupt funktionieren soll. Wenn dein Wert f knapp über Pi liegt rufst sie rekursiv mit f - 2*Pi wieder auf. Jetzt ist der Parameter ja negativ, also kleiner Pi dann rufst du sie wieder mit f + 2*Pi auf (das ist der Ausgangswert). Da hast du eine unendliche Rekursion.



  • ah, CStoll hast recht. Ich hatte gelesen f <-GPI (was mir sinnvoller erschien)



  • Versuchs mal damit

    inline float GSin(const float f)
    {
    	float fTemp_3=f*f*f;
    	return( f>GPI
    			? GSin(f-2.F*GPI)
    			: f<-GPI
    			  ? GSin(f+2.F*GPI)
    			  : (f - 0.0001984F*fTemp_3*fTemp_3*f + 0.0083333F*fTemp_3*f*f - 0.1666667F*fTemp_3) );
    }
    

    Du Idiot hast geschrieben f<GPI Das ist falsch! richtig ist f<-GPI

    DU HAST DAS "MINUS" VERGESSEN



  • Danke für die schnellen Antworten!

    @Dummie 0815: Bitte gewöhn dir den Stil wie "Du Idiot" ab

    PS: Großschreibung bedeutet soviel wie Schreien


Anmelden zum Antworten