c++ Mindestgenauigkeit?
Hey Leute,
brauche Hilfe bei folgender Aufgabe:
Lassen Sie dafür den Benutzer eine frei wählbare Mindest-Genauigkeit der Berechnung eingeben, wie z.B. 0.001(ein Tausendstel), und brechen Sie die Schleife ab, sobald die gewünschte Genauigkeit erreicht ist. Die Genauigkeit ergibt sich natürlich aus der Differenz zwischen den Werten von xnund xn-1.
Mein quellcode sieht bis jetzt so aus:
int main()
{
double in{ 0.0 }; //Initialisieren der input Zahl
double x{ 1.0 };
double xn{ 1.0 };
int p{ 0 };
cout << "Geben Sie eine Fliesskommazahl ein um die Wurzel zu berechnen: \n";
cin >> in; //Einlesen der zu berechnenden Zahl
cout << "Geben Sie die gewuenschte Genauigkeit ein: " << "\n"; //User wird aufgefordert die Genauigkeit der double einzugeben
cin >> p;
if (in > 0); //Wenn input höher als null ist wird ausgeführt:
{
cout << "Sie haben folgende Zahl zum berechnen eingegeben: " << in << "\n"; //Input Zahl wird ausgegeben
while (x - (x-1) <= p) //i startet bei 0 und wird bis zum 8. Durchlauf ausgeführt
{
x = xn; //Zuweisung für die Wurzel
xn = (x + in / x) / 2; //Zuweisung der Formel der Wurzelberechnung für xn
// cout.precision(p); //Die Zahlen werden mit der Genauigkeit p ausgegeben
cout << x << "\n"; //Ausgabe der Wurzelberechnung
}
cout << "Die Wurzelberechnung ergibt: " << x << "\n";
}
return 0;
}
wie kann ich meine while schleife ändern, sodass ich die aufgabe erfülle? hänge hier fest..
2 Antworten
Ich vermute, du sollst die Wurzel über die Schleife ermitteln und kannst nicht einfach die Wurzel-Methode in einer der Bibliotheken nutzen?! ;-)
----
Welche Optionen hast du denn im Unterricht kennengelernt um die Anzahl der Nachkommastellen zu ermitteln?
Ich bin kein Kenner von C++, aber es gibt sicher Funktionen die du dafür benutzen könntest (math Bibliothek und da mal nach modf zum Beispiel gucken).
Ansonsten wäre doch sicher ein Typecast möglich: Ein Int, ein weiteres float - die Zahl ins Int casten, dann vom float subtrahieren und du hast nur noch den Rest (quasi eine Art modulo mit 1). Und dann gucken ob die Zahl größer ist als die gewünschte Genauigkeit. Das gibt aber Probleme mit der Quadratwurzel aus 9 zum Beispiel.
Ansonsten könntest du eine Zählvariable nutzen: 1 / Genauigkeit / 10 = Anzahl der Nachkommastellen.
Beispiel 1 : 0.001 = 1000 = 3 Nachkommstellen.
Also müsstest du 4 Nachkommastellen ermitteln, auf 3 Nachkommastellen runden, ausgeben und dann ein break; setzen.
Sorry, Mutter hat Geburtstag...
Aaaalso, für Genauigkeit hast du zum einen oben ein Int deklariert, obwohl es wohl ein double (oder float) sein soll.
Zum anderen erscheint mir die Schleifenabfrage falsch. Setz x mal auf 0.0 und dann
while (xn - x > p)
Wenn du jetzt du Wurzel von 4 ermitteln willst mit einer Genauigkeit von 0.001 dann sähe das wie folgt aus:
1.0 - 0.0 = 1.0 > 0.001
2.5 - 1.0 = 1.5 > 0.001
2.05 - 2.5 = 0.45 > 0.001
2.000609 - 2,05 = 0,049.. > 0.001
2.000609 - 2.0000000000093 = 0,000609... < 0,001
Allerdings brauchst du den Absolut-Wert der Differenz, sonst funktioniert das nicht. Entweder musst du die Funktion aus math nehmen, selbst eine schreiben, oder vor der While-Schleife die Differenz berechnen (zusätzliche Variable):
zum Beispiel:
tmp = xn - x;
if (tmp<0) {
tmp = tmp * -1.0;
}
while (tmp > p)
...
Auch musst du die Ausgabe danach noch modifizieren, dass er dir nur entsprechend viele Nachkommastellen anzeigt, wie angegeben.
Ich habe hier deinen Quelltext mal eben für Java übernommen und entsprechend angepasst. Solltest du problemlos nach entsprechender Bearbeitung für c++ übernehmen können:
double in=4.0;
double x=0.0;
double xn=1.0;
double p=0.001;
double differ=0.0;
int kuerzen=0;
if (in > 0)
{
System.out.println("Sie haben folgende Zahl zum berechnen eingegeben: " + in + "\n");
differ = xn - x;
while (differ > p)
{
x = xn;
xn = (in / x + x) / 2;
differ = xn - x;
if (differ < 0){
differ = differ * (-1.0);
}
}
kuerzen = ( int ) (xn/p);
xn = kuerzen * p;
System.out.println("Die Wurzelberechnung ergibt: " + xn + "\n");
in=0;
}
ich würde sagen
float ausgabe = int(Wurzel) * 100 / 100
die einhundert dann je nach genauigkeit anpassen
genau, sollen ohne bib lösen. und der prof hat uns zur while schleife geraten (Die Genauigkeit ergibt sich natürlich aus der Differenz zwischen den Werten von xnund xn-1) sprich so lange xn und xn-1 <= genauigkeit sind wird die schleife ausgeführt.
aber wie kann ich das nun programmieren, sodass mir das ausgegeben wird?