Problem mit Rechenfunktion --> wo ist die Genauigkeit geblieben?



  • Hallo zusammen,
    ich habe eine Funktion erstellt, mit der ein Taschenrechner Sinuswerte sehr genau im Intervall -pi bis +pi errechnen kann. Zwar kann man die noch verbessern, doch dieses Polynom liefert Werte bis auf einer Genauigkeit von 5 Stellen. Aber darum gehts eigentlich gar nicht 😉

    Ich habe mir vor einiger Zeit eine Graphikkomponente programmiert, die einen Graphen ausgibt. Nun wundere ich mich, warum bei dieser Funktion eine Gerade ausgegeben wird:

    f(x) = -1 / 5040 x⁷ + 1 / 120 x⁵ - 1 / 6 x³ + x

    Ich habe mir also mal die Werte einzeln ausgeben lassen. Der Stil ist nicht so schön, aber das ist jetzt egal:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main()
    {
    	double x[100], y[100];
    	int i = 0;
    	double k = -6;
    
    	while(k < 7-0.13)
    	{
    		x[i] = k;
    		y[i] = (-1/5040)*pow(k,7) + (1/120)*pow(k,5) - (1/6)*pow(k,3) + k;
    		cout << x[i] << "             " << y[i] << endl;
    		i++;
    		k+=0.13;
    	}
    
    	return 0;
    }
    

    Warum werden in das x-Array und in das y-Array gleiche Werte reingeschrieben. Stehe ich einfach nur auf dem Schlauch oder warum wird meine Funktion ignoriert? Was mache ich falsch? Was passiert beim Beschreiben des Arrays y?

    Vielen Dank
    lg, freakC++



  • Weil du Integer durch Integer teilst. Da kommt ein (gerundeter) Integer bei raus.

    Mach daraus: y[i] = (-1/5040)*pow(k,7) + (1/120)*pow(k,5) - (1/6)*pow(k,3) + k;
    einfach: y[i] = (-1./5040.)*pow(k,7) + (1./120.)*pow(k,5) - (1./6.)*pow(k,3) + k;

    dann sollte es gehen. Den Rest habe ich mir nicht angeschaut, hab es eilig. :p



  • Jap, daran hats gelegen. Vielen Dank. Da habe ich aber was beim Casting verpasst. Da ich doch mit double Werten arbeite, dachte ich, dass automatisch "hochkonvertiert" wird. Ist das nicht so? Warum?

    edit: Ahh...oder machen die Divisionen Schwierigkeiten und da die Funktion pow nur doubles nimmt...ahh 😃 !

    Warum wird dann aber nicht "hochkonvertiert", sondern anscheinend runter?

    Vielen Dank
    lg, freakC++



  • Bei 1/5400*pow(...) wird erst 1/5400 berechnet, das ist ein int, weil beide Operanden int sind. Das Ergebnis von pow ist double, also wird auch der linke Operand, das Ergebnis von 1/5400, zu double konvertiert und die Multiplikation in double durchgeführt.



  • Ok, super! Hab' ich verstanden!

    Vielen Dank
    lg, freakC++


Anmelden zum Antworten