Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

Geschrieben

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! :)

Geschrieben
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.

Geschrieben

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

Geschrieben

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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...