W3docs

expm1()

Die PHP-Funktion expm1() berechnet den exponentiellen Wert einer Zahl minus 1 mit voller Gleitkommagenauigkeit.

Die PHP-Funktion expm1() gibt e hoch einer Zahl, minus 1 zurück — also exp(x) - 1. Ihr Vorteil liegt darin, dieses Ergebnis präzise für kleine x-Werte zu berechnen, bei denen das naive exp($x) - 1 an Genauigkeit verliert. Diese Seite erklärt, was expm1() tut, seine Syntax, wann man es statt exp() verwenden sollte, und das Problem, zu dessen Lösung es existiert.

Syntax

expm1(float $num): float
ParameterBeschreibung
$numErforderlich. Der Exponent. Eine beliebige Zahl — positiv, negativ oder null. Nicht-float-Werte werden zu float konvertiert.

Rückgabewert: e hoch $num, minus 1, als float. Dabei ist e die Eulersche Zahl (≈ 2.718281828).

Einfaches Beispiel

php— editable, runs on the server

Da e^2 ≈ 7.389056 ist, ergibt das Subtrahieren von 1 die folgende Ausgabe:

6.3890560989307

(PHP gibt standardmäßig 14 signifikante Stellen aus, gesteuert durch die INI-Einstellung precision.)

Warum nicht einfach exp($x) - 1 schreiben?

Für die meisten Eingaben liefern expm1($x) und exp($x) - 1 dasselbe Ergebnis. Der Unterschied zeigt sich, wenn $x sehr nah an null liegt.

Wenn $x sehr klein ist, liegt exp($x) sehr nahe bei 1, sodass exp($x) - 1 zwei fast gleiche Gleitkommazahlen subtrahiert. Die meisten signifikanten Stellen heben sich dabei auf — ein Problem, das als katastrophale Auslöschung bekannt ist — und das Ergebnis ist deutlich weniger präzise. expm1() ist so implementiert, dass es e^x - 1 direkt berechnet und dabei die volle Präzision beibehält:

<?php
$x = 1e-15;

echo exp($x) - 1; // imprecise: digits cancel
echo "\n";
echo expm1($x);   // accurate
?>

Die naive Subtraktion liefert ungefähr 1.1102230246252E-15, während expm1() 1.0E-15 zurückgibt, was der korrekte Wert ist. Immer wenn man Zinsen, Zerfall oder Wachstum über sehr kleine Zeitschritte zusammensetzt, ist expm1() die sichere Wahl.

Negative Argumente und null

expm1() akzeptiert den gesamten Bereich reeller Zahlen:

<?php
echo expm1(0);   // e^0 - 1 = 0
echo "\n";
echo expm1(-1);  // 1/e - 1, a negative result
?>

Das gibt aus:

0
-0.63212055882856

expm1(0) ist exakt 0, und negative Argumente liefern Ergebnisse zwischen -1 und 0.

Wann expm1() verwenden?

  • Finanzberechnungen mit kleinen Raten (z. B. Umrechnung eines Jahreszinssatzes in einen sekundengenauen Zinssatz).
  • Modelle für kontinuierliches Wachstum oder Zerfall, ausgewertet über winzige Intervalle.
  • Jede Formel der Form e^x - 1, bei der x gegen null gehen kann.

Für die umgekehrte Richtung — genaue Berechnung von log(1 + x) für kleine x — verwendet man die Begleitfunktion log1p(). Für gewöhnliche Exponentiation ohne das -1 verwendet man exp().

Fazit

expm1() berechnet e^x - 1 mit voller Gleitkommagenauigkeit, selbst wenn x nahe null liegt, wo exp($x) - 1 an Präzision verlieren würde. Greife darauf in wissenschaftlichen und finanziellen Berechnungen mit kleinen Exponenten zurück; für alles andere ist exp() ausreichend. Siehe auch die inverse Funktion log1p().

Übungen

Übung
Was trifft auf die Funktion expm1 in PHP zu?
Was trifft auf die Funktion expm1 in PHP zu?
Was this page helpful?