Logarithmus



  • hintergrund ist, dass ich selbst eine funktion zur logarithmusberechnung einer beliebigen Basis schreiben möchte. Ich kenne die Intervallschachtelung, aber ich hab mir gedacht dass das der Rechner sicherlich nicht so macht, da diese methode nicht sonderlich schnell ist. Und die Reihenentwicklung gilt ja nur für den natürlichen Logarithmus..



  • Über den natürlichen Logarithmus kannst du aber alle anderen Logarithmen berechnen.



  • ahh.. jetzt fällt es mir wieder ein.. Basiswechsel nennt sich das ding^^ (lg(x) = ln(x)/ln(10))
    hab jetzt aus Wikipedia die Formel für den natürlichen Logarithmus:

    ln(x) = lim[h->0]( (x^h -1)/h )
    

    soll ich jetzt für h einfach den kleinmöglichen Wert einer double-variabel einsetzen ? (2.2250738585072014 E–308)



  • na wenn du das machst sind doch artefakte vorprogrammiert. vielleicht geht ja was mit newton iteration, die ableitung laesst sich ja gut berechnen. aber ich bin kein numeriker. 😉



  • Man koennte auch 1/t von 1 bis x integrieren um ln(x) zu bekommen. Mit der Rombergintegration duerfte das doch beliebig genau gehen.



  • ihr bombadiert mich hier mit wörter.. bin weder mathematiker noch numeriker, sondern Schüler (wurde glaube ich auch schon erwähnt^^) egal.. werd mich mal ein bisschen Informieren, dann verstehe ich vielleicht sogar was ihr da eben geschrieben habt xD



  • Argus Magnus schrieb:

    ihr bombadiert mich hier mit wörter..

    das ist absicht: die wollen dir stichwörter geben, nach denen du suchen kannst.



  • Eine Kombi aus Wertetabelle und Spline (Interpolation) ist auch eine Option. Funktioniert für oft diff'bare Funktionen recht gut. Es gibt also nur Probleme bei x nahe 0.



  • Argus Magnus schrieb:

    ahh.. jetzt fällt es mir wieder ein.. Basiswechsel nennt sich das ding^^ (lg(x) = ln(x)/ln(10))
    hab jetzt aus Wikipedia die Formel für den natürlichen Logarithmus:

    ln(x) = lim[h->0]( (x^h -1)/h )
    

    soll ich jetzt für h einfach den kleinmöglichen Wert einer double-variabel einsetzen ? (2.2250738585072014 E–308)

    Erstmal ne doofe Frage: Wie rechnest du Potenzen aus? Wenn du schon in den Rechner reinschauen willst, dann musst du dir das auch noch überlegen 🙂

    Nächstes Problem: x^(beinahe Null) wird auf dem Rechner mal ganz schnell zu einer echten Eins (weil x^0 == 1). Dann steht im Nenner ne Null und dein Logarithmus ist Null. Das ist doof. Beispiel in C:

    double h = 1e-300;
    double nenner = pow(2,h) - 1;
    double ln2 = nenner/h;
    
    printf("%e\n%e\n%e\n%e",h,nenner,ln2,log(2));
    

    Ausgabe:
    1.0000e-300
    0.0000e+000
    0.0000e+000
    6.9314e-001

    Ok, h größer machen, damit der Nenner nicht Null wird. Mit h=1e-10 bekommen wir

    1.0000e-010
    6.9314e-001
    6.9314e-001
    6.9314e-001

    Das sieht super aus. Aber rechnet man mit h=1e-10 den ln von 4096 aus, klappt es schon wieder nicht. Dann ist nämlich h=1e-10 nicht klein genug.

    Der Weg ist ziemlich wackelig zu sein, weil man zu sehr von den Gemeinheiten der Rechnerarithmetik abhängt....



  • Argus Magnus schrieb:

    Aber was passiert da genau, was macht der Rechner?

    taschenrechner verwenden oft sowas wie's hier mit C simuliert wird: https://people.scs.fsu.edu/~burkardt/cpp_src/cordic/cordic.C
    wegen des 'ln': such dir im code die funktion 'double ln_cordic (double x, int n)'
    raus.
    🙂


Anmelden zum Antworten