Zum Inhalt springen

Endlosschleife


Daffi

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...