Quadratwurzel von 2



  • Liebe Community,

    wir hatten heute im Matheunterricht,
    dass die Nachkommastellen der Quadratwurzel von 2 unendlich sind
    und eine Methode, wie man sie annäherungsweise mit Intervallen berechnen kann.

    Ich hab dann angefangen das ganze als Programm umzusetzen,
    dabei läuft alles perfekt, bis zu dem Punkt,
    als die untere Grenze 1,41421 und die obere Grenze 1,41422 beträgt.
    Für die Funktion pow() ist nämlich 1,41421^2 = 2 und 1,41422^2 ebenso.

    Das zerstört meine ganze funktion, da es dann nicht mehr weiterrechnen kann.

    Nun meine Frage: Kennt ihr eine Bibliothek, in der eine genauere Funktion zum Potenzieren vorhanden ist?

    Patrick



  • patrick246 schrieb:

    Für die Funktion pow() ist nämlich 1,41421^2 = 2 und 1,41422^2 ebenso.

    Nee, Du zeigst nru sechsstellig an. Setze die Anzeigepräzision hoch. Der hat schon bis hinten hin korrekt gerechnet.



  • Danke für die schnelle Lösung! Ich habe die Anzeigepräzision mit setprecision(27) hochgesetzt,
    aber jetzt erscheinen hinter der Zahl, wo eigentlich nichts mehr kommen dürfte andere Zahlen!
    Beispiel: 1.1000000000000001, obwohl im Code 1.1 definiert wurde.
    Ich denke dafür gibt es sicher auch eine einfache Lösung,
    auf die ich nicht kommen werde 😃

    Edit: Ich habs mal durchlaufen lassen: es ist soweit schonmal korrekt!



  • patrick246 schrieb:

    Beispiel: 1.1000000000000001, obwohl im Code 1.1 definiert wurde.
    Ich denke dafür gibt es sicher auch eine einfache Lösung,
    auf die ich nicht kommen werde 😃

    Ja, einfach ignorieren. Der Wert 1.1 kann nicht exakt als double dargestellt werden, deswegen verwendet das Programm den nächstgelegenen darstellbaren Wert.



  • patrick246 schrieb:

    Beispiel: 1.1000000000000001, obwohl im Code 1.1 definiert wurde.

    double verwendet bei Dir wahrscheinlich das 64-Bit IEEE-754 Format. Das heißt, es werden 64 Bits für die Darstellung von Zahlen verwendet. Offensichtlich gibt es nicht unendlich viele 64-Bit-Kombinationen. Ergo kann man mit double nur ganz wenige Zahlen exakt darstellen. Den Rest rundet man auf die nächste darstellbare Zahl. Darüberhinaus arbeitet dieses Format binär. Der Wertebereich zwischen 1 und 2 wird beispielsweise mit der "Schrittweite" 2^(-52) aufgelöst. Die Dezimalzahl 1,1 ist aber nicht dabei, da 0,1 kein Vielfaches der Schrittweite dieses Intervalls ist.

    Merk Dir, dass man, ausgehend vom 64-Bit IEEE-754 Formats (welches der C++ Standard aber nicht erzwingt), im schlimmsten Fall nur 15 Dezimalstellen unverfälscht darstellen kann.

    Andersherum kann man sich aber auch fragen: Wie viele Dezimalstellen brauche ich, um einen per double darstellbaren Wert eindeutig zu identifizieren? Hier ist die Antwort 17. Obwohl man mit 17 Dezimalstellen eine double-Zahl nicht unbedingt exakt darstellen kann, ist man mit 17 Stellen genau genug, so dass keine andere double-Zahl hätte gemeint sein können. In Deinem Fall ist die 1.1000000000000001 nicht die Zahl, die double exakt speichert sondern nur eine angenäherte Darstellung mit 17 Stellen.



  • Ja, ich habe es auch als long double definiert. Danke für die guten Tipps hier.
    Patrick


Log in to reply