[linux-l] [OT] Gewichtete Wahrscheinlichkeit, Random

Volker Grabsch vog at notjusthosting.com
Sa Feb 24 21:59:18 CET 2007


On Tue, Feb 20, 2007 at 10:14:56PM +0100, Oliver Bandel wrote:
> Wenn mich nicht alles täuscht, folgen nicht alle Programmiersprachen
> der mathematischen Konvention und lassen log() für dekadischen (oder einen allgemeinen)
> und ln()  für den Logarithmus zur Basis zwei stehen.

Du meinst, ln() zur Basis e, richtig?

Das "n" steht für "natural" (oder so ähnlich), also den natürlichen
Logarithmus.

(Falls es jemanden interessiert: Man nenn ihn deshalb "natürlich",
weil er die einzige Funktion f mit der Eigenschaft f'(x) = 1/x ist.
Bei allen anderen Logarithmen kommt da noch ein konstanter Faktor
hinzu, und ja, die Nullfunktion ist ebenfalls genaunommen eine
"logarithmische Funktion" ... eine Funktion f heißt logarithmisch,
wenn f(a*b) = f(a) + f(b) für beliebige positive Zahlen a,b gilt.
Jetzt aber genug vom Mathe-Exkurs.)

> Unter den BSD-Manpages fand ichsogar ein log2() und ein log1p().
> log2()ist klar: Log. zur Basis zwei, und log1p() kannte ich vorher noch nicht:
> 
> 
>   "The log1p() function computes the value of log(1+x) accurately even for
>    very small values of x."
>       (aus "man 3 log" unter OS-X)

Hintergrund ist, dass man bei *wirklich* kleinen Werten für x in der
Gleitkomma-Darstellung (float, double) den Wert 1+x nicht darstellen
kann, da dieser auf 1 gerundet oder zumindest extrem ungenau wird.

Beispiel (mal dezimal, weil binär etwas unanschaulich ist):
Bei x = 0,0000000123 haben wir die Gleitkomma-Darstellung
    x   = 1,23 * 10^(-10)
Man braucht sich also nur 2 Nachkommastelen zu merken (2 und 3),
und den Exponent "-10". Aber 1+x hat die Darstellung:
    1+x = 1,0000000123 * 10^0
Man muss sich also 10 Nachkommastellen und den Exponent 0 speichern.
Kann dein Datentyp nur 8 Nachkommastellen erfassen, so kann er
x sauber abspeichern, aber 1+x muss er runden zu:
    1+x = 1,00000001 * 10^0
Noch schlimmer: Wenn er nur 7 oder weniger Nachkommastellen kann,
muss er auf
    1+x = 1
runden, was zum völlig unbrauchbaren Ergebnis ln(1+x) = 0 führt.
Jaja, die Nummerik ist ein weites Feld ...


Das log1p() umgeht das Problem geschickt, indem es diesen gefährlichen
Term "1+x" erst gar nicht ausrechnet, sondern "direkt" dessen
Logarithmus.


(Wer sich die Tailorreihen für ln() ansieht, wird feststellen, dass
die Formeln eigentlich sowieso für ln(1+x) oder ln((1+x)/(1-x)) gelten.
Es ist also eigentlich sogar viel "normaler" bzw. "natürlicher", den
ln() von "1+x" statt von "x" auszurechnen.)


Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l