Ich habe eine einfache Frage, die für Google wirklich schwierig ist (neben der kanonischen, was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte ).
Wann sollten Funktionen wie log1p
oder expm1
anstelle von log
und verwendet werden exp
? Wann sollten sie nicht verwendet werden? Wie unterscheiden sich die verschiedenen Implementierungen dieser Funktionen hinsichtlich ihrer Verwendung?
floating-point
Tim
quelle
quelle
log1p
Sie sich beziehen (insbesondere wie es implementiert ist, damit wir nicht raten müssen).Antworten:
Dies kann leicht in Python demonstriert werden:
Im Allgemeinen sollte eine "genaue" Implementierung von
exp
undexpm1
auf nicht mehr als 1ULP (dh eine Einheit des letzten Platzes) korrekt sein. Da das Erreichen dieser Genauigkeit jedoch zu einem "langsamen" Code führt, ist manchmal eine schnelle, weniger genaue Implementierung verfügbar. Zum Beispiel in CUDA haben wirexpf
undexpm1f
, wof
steht für schnell. Laut dem CUDA C-Programmierhandbuch, App. D dasexpf
hat einen Fehler von 2ULP.Wenn Sie sich nicht um Fehler in der Größenordnung weniger ULPS kümmern, sind in der Regel unterschiedliche Implementierungen der Exponentialfunktion gleichwertig. Beachten Sie jedoch, dass Fehler möglicherweise irgendwo versteckt sind ... (Denken Sie an den Pentium FDIV-Fehler ?)
expm1
expm1
log
log1p
quelle
expm1(x)
anstelle von verwendenexp(x)-1
. Gilt natürlichexp(x) == exp(x) - 1
generell nicht.expm1(x)
exp(x) - 1
Um den Unterschied zwischen
log
und zu erweitern, kannlog1p
es hilfreich sein, den Graphen wieder aufzurufen, wenn der Logarithmus:log
log1p
log
log1p
quelle