Daffi Geschrieben 11. November 2008 Geschrieben 11. November 2008 Hi, folgendes ist das problem. Ich sollt ein Programm schreiben was mir die wurzel berechnet und diese mit der sqrt der math.h vergleicht. Das problem ist das die Werte richtig sind allerdings eine endlosschleife entsteht. Ausschnitt aus dem programm: yneu=(eingabe/2); do{ yalt=yneu; yneu=0.5*((eingabe/yalt)+yalt); printf("\n%f\n",yneu); printf("%f\n",abs(yneu-yalt)); } while ((abs(yneu-yalt)) < (pow(10,-epsilon))); printf("\n%f",yneu); printf("\n%f",sqrt(eingabe)); getch(); läuft wie gesagt bis dahin dufte. Woran liegt das? Zitieren
Guybrush Threepwood Geschrieben 11. November 2008 Geschrieben 11. November 2008 Woran liegt das? Daran das (abs(yneu-yalt)) kleiner ist als (pow(10,-epsilon))? Zitieren
Daffi Geschrieben 11. November 2008 Autor Geschrieben 11. November 2008 Ja die schleife sollte ja auch abbrechen wenn der Unterschied zu gering wird und die annäherung akzeptabel ist. Das epsilon beträgt so um die 8. Zitieren
Hexagon Geschrieben 12. November 2008 Geschrieben 12. November 2008 Moin. Könnte man auch erfahren was für Typen eingabe, yneu, yalt und epsilon sind? Zitieren
Klotzkopp Geschrieben 12. November 2008 Geschrieben 12. November 2008 Erstens ist die Schleifenbedingung falsch. Deine Schleife läuft, solange die Differenz kleiner als 10 hoch -epsilon ist, sie sollte aber laufen, solange das nicht der Fall ist. Zweitens musst du fabs benutzen, nicht abs. abs gibt int zurück, und damit ist abs(yneu-yalt) je nach Wert von eingabe sofort 0. Zitieren
AndreUrban Geschrieben 12. November 2008 Geschrieben 12. November 2008 Ich bin kein Programmierprofi, aber wenn man eine Schleife in einem Programm beenden will, sollte der Befehl "break" eigentlich nicht fehlen?! Mal ungeachtet von den Bedingungen in der Do-Schleife! Aber wie gesagt, bin kein Profi! Zitieren
Klotzkopp Geschrieben 12. November 2008 Geschrieben 12. November 2008 Ich bin kein Programmierprofi, aber wenn man eine Schleife in einem Programm beenden will, sollte der Befehl "break" eigentlich nicht fehlen?! Nein, break braucht man nicht unbedingt. Alle Schleifen haben zu diesem Zweck die eingebaute Bedingung, die steuert, wie lange die Schleife läuft. Die break-Anweisung benutzt man normalerweise nur, wenn ein unerwartetes Ereignis eintritt und die Schleife vorzeitig beendet werden soll. Letztlich ist das eine Stilfrage, aber notwendig ist break nicht. Zitieren
flashpixx Geschrieben 12. November 2008 Geschrieben 12. November 2008 Die Prüfung ob die Epsilongrenze erreicht ist, kann man auch entsprechend als Funktion angeben: bool isNumericEqual( const double& pn1, const double& pn2 ) { return !( std::fabs(pn1-pn2) > std::numeric_limits<double>::epsilon() ); } bool isNumericNull( const double& pn ) { return std::fabs(pn) <= std::numeric_limits<double>::epsilon(); } HTH Phil Zitieren
Daffi Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Also ich habs hinbekommen! Danke für den tipp mit dem fabs! zum verständnis der Quelltext! #include <stdio.h> #include <math.h> #include <conio.h> int main () { float eingabe,epsilon; float yalt=0,yneu=0; printf("Programm zum n\204herungsweisen ziehen von Wurzeln:\n"); printf("------------------------------------------------\n\n"); printf("Von welchem x wollen sie die Wurzel berechnen?"); //Abfangen von Buchstabeneingaben und negativen Zahlen while((0==scanf("%f",&eingabe)) | (eingabe<0) ) { printf("\nIhr angegebener Wert ist keine positive Zahl!\n"); printf("Neue Eingabe:"); fflush(stdin); } printf("\n -----------------------"); printf("\nIhre Genauigkeitsschranke soll welchen Wert besitzen? | Form: 10^(-epsilon) |"); printf("\n -----------------------\n"); //Abfrage Epsilon = Genauigkeitswert printf("epsilon="); scanf("%f",ε); fflush(stdin); //Berechnung yneu=(eingabe/2); printf("\nZwischenschritte:\n"); printf("-----------------\n"); do{ yalt=yneu; //Variablentausch yneu=0.5*((eingabe/yalt)+yalt); //Ausgabe der Zwischenergebnisse printf("Yneu = %f\n",yneu); printf("Differenz = %f\n",fabs(yneu-yalt)); } while ((fabs(yneu-yalt)) > (pow(10,-epsilon))); //fabs = abs für float! printf("\nDer durch Ann\204herung ermittelte Wert betr\204gt %f.",yneu); printf("\nDer mit sqrt berechnete Wert ist %f.",sqrt(eingabe)); getch(); } Es funktioniert. Wer sonst noch Hinweise hat, ich wäre dankbar. Fange wie gesagt erst an die Sprache zu lernen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.