Wurzel mit Heronverfahren und Genauigkeit berechnen



  • Oh stimmt... Danke. Wieder viel zu kompliziert gedacht.

    Aber es müsste doch if(y>=0) sein oder? Also der Exponent :xmas1:



  • Roger292 schrieb:

    Aber es müsste doch if(y>=0) sein oder? Also der Exponent :xmas1:

    Klar. :xmas1:



  • #include <stdio.h>
    
    double wurzel(double zahl, double genau);
    double selfpow(double x, int y);
    double fullpow(double x, int y);
    
    int main()
    {
    	double zahl = 0;
    	double genau = 0;
    	printf("%lf\n",selfpow(10.0,1));
    	printf("Bitte Zahl eingeben, deren Wurzel berechnet werden soll:\n");
    	scanf("%lf",&zahl);
    
    	printf("\n\nBitte Anzahl der gültigen Stellen hinter dem Komma eingeben:\n");
    	scanf("%lf",&genau);
    
    	printf("Die Wurzel von %lf ist %lf.\n\n",zahl,wurzel(zahl,genau));
    
    	return 0;
    
    }
    
    double wurzel(double zahl,double genau)
    {
    	double x = zahl;
    	double xn = 2*zahl;
    
    	while((xn-x)>(fullpow(10.0,-genau)))
    	{	xn=x;
    
    		x=1.0/2.0*(xn+(zahl/xn));
    
    	};
    
    	return x;
    
    }
    
    double selfpow(double x, int y) 
    { 
        int i= 1; 
    
        while(i<y) 
        { 
           x*=x; 
           i++; 
    
        }; 
    
        return x; 
    }
    
    double fullpow(double x, int y)
    {
    	if(y>=0)
    		return selfpow(double x, int y);
    	else
    		return 1.0/selfpow(double x, int y);
    }
    

    Danke danke hier ist jez der Code, aber mein Compiler meckert rum, das da unten ne ) vor Typ fehlen würde und, dass bei fullpow nicht genügend Argumente für den Aufruf von selfpow vorhanden sind.



  • Schon gefunden 😃

    Hatte die vollständige deklaration da unten mit int und double xD

    Ich danke euch :). Wie immer sehr hilfsbereit und informativ auch bei dummen Fehlern. Dann mach ich mich mal an die Nullstellenberechnung von x^5-x-1 yay 😃
    aber ich bin optimistisch.^^



  • Dein selfpow rechnet aber nicht richtig.
    Für selfpow(2,3) kommt 16 raus.



  • Och neee -.- hmm wo isn der Fehler?

    Achja und wenn ich z.b.

    printf("Die Wurzel von %lf ist %.2lf.\n\n",zahl,wurzel(zahl,genau));
    

    hab, dann ist die Genauigkeit in der Ausgabe durch das .2 definiert. Wie kann ich dort denn den Wert von der variablen genau einsetzen?

    EDIT: Wahrscheinlich wegen x*=x oder DirkB?

    Ok habs verbessert:

    double selfpow(double x, int y) 
    { 
        int i= 1;
    	double xneu = x ;
    
        while(i<y) 
        { 
           xneu*=x; 
           i++; 
    
        }; 
    
        return xneu; 
    }
    

    Aber warum gibt er mir folgende Ausgabe für printf("%lf",selfpow(2,3));

    8.0000000.000000?????



  • %lf bei printf ist auch falsch.



  • Warum? Rückgabewert von selfpow ist ein double.



  • Du hast printf() und nicht scanf(). Da gibt es Unterschiede.
    %f steht bei printf() für double und float.

    Das liegt daran, dass printf() eine variable Argumentenliste hat. Da wird float auf double erweitert.



  • aha... Ok das wusste ich nich.

    Wenn ich jez

    printf("Die Wurzel von %f ist %.2f.\n\n",zahl,wurzel(zahl,genau));
    

    hab, dann ist die Genauigkeit in der Ausgabe durch das .2 definiert. Wie kann ich dort denn den Wert von der Variablen "genau" einsetzen?

    Könnt ihr mir da helfen? :xmas2:



  • Ganz so einfach ist das nicht, denn genau ist eine Fließkommazahl.
    Du kannst aber mit dem *

    printf("Die Wurzel von %f ist %.*f.\n\n",zahl,2,wurzel(zahl,genau));
    

    die Anzahl der Stellen mit einer Integerzahl/variablen angeben (hier die 2).
    Du musst jetzt nur noch aus genau die Anzahl der Stellen berechnen (oder umgekehrt)


Anmelden zum Antworten