Wurzel mit Heronverfahren und Genauigkeit berechnen
-
0.0000001 statt 0,0000001
-
Roger292 schrieb:
Und ja ich weiß ich bräuchte pow(10.0,genau) aber der mathe.h header ist laut Aufgabenstellung kaputt -.- .
Dann würde ich anfangs die pow aus <math.h> trotzdem benutzen.
Und wenn die Wurzel klappt, würde ich eine eigene pow schreiben, das halt nur ganzzahlige Exponenten kann, sodaß die andere nicht mehr benötigt wird.
-
Oh wie peinlich^^... aber leider hats nichts geändert..
-
Oh, BÖSE Falle!
1/2==01/2*(xn+(zahl/xn))
also auch.
-
hmm ja das wär ne Möglichkeit... Oder vllt fällt mir noch ne andere Möglichkeit ein, aber ich versteh nich warum dieses komische Ergebnis rauskommt.
-
Roger292 schrieb:
aber ich versteh nich warum dieses komische Ergebnis rauskommt.
Weil im ersten Durchlauf xn=0 passiert und im zweiten Durchlauf kracht zahl/xn.
-
OHHHHH ja das passiert mir immer wieder. Dieses olle float
Ok jez bekomme ich ne vernünftige Zahl. Dann ist ja nurnoch das Genauigkeitsproblem übrig... mit pow() klappts auch.
Dann muss ich pow wahrscheinlich selber nochmal programmieren.
Das wäre dann irgendne while Schleife mit ner Zählvariablen i und dann sowas wie x*=x oder so. Passt das halbwegs?
double selfpow(int x, int y) { int i= 0; while(i<y) { x*=x; i++; }; return x; }
funktioniert aber nur für positive exponenten
.. Für negative exponenten scheint das ein wenig schwieriger zu sein.
-
Was ist die Wurzel von 11? Was ist die Wurzel von 31?
Diese Frage auf einem Papierzettel nur von Hand ausrechnen per Heronverfahren.
(und spaßhalber Bonus:) Was ist die dritte Wurzel von 11, was ist die vierte Wurzel von 31?
Auf Papier aufzeichnen, herleiten, und die kritische Stelle bei der Programmierung des Algos finden.
(und die Zwischenschritte im Programm (Liste) aufzulisten, wäre auch nicht so übel)
-
Roger292 schrieb:
funktioniert aber nur für positive exponenten
.. Für negative exponenten scheint das ein wenig schwieriger zu sein.
double fullpow(double x,int y){ if(x>=0) return selfpow(x,y); else return 1.0/selfpow(x,-y); }
-
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)