Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

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.

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.

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

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.

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

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 Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.