c++ Mindestgenauigkeit?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Greenready 
Fragesteller
 10.05.2021, 16:02

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?

0
GuteAntwort2021  10.05.2021, 20:48
@Greenready

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.

1
GuteAntwort2021  10.05.2021, 21:06
@Greenready

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;
  }
1

ich würde sagen

float ausgabe = int(Wurzel) * 100 / 100

die einhundert dann je nach genauigkeit anpassen