Signatur
Beschreibung
expm1() berechnet den Wert enum - 1, wobei e die Eulersche Zahl (~2.71828) ist. Im Vergleich zu einem einfachen exp($num) - 1 liefert diese Funktion bei Werten von $num nahe Null deutlich genauere Ergebnisse, da sie Rundungsfehler durch Auslöschung vermeidet.
Das Problem bei naiven Berechnungen wie exp($x) - 1 für sehr kleine $x: exp($x) liegt sehr nah an 1, und die anschließende Subtraktion führt zu einem massiven Verlust signifikanter Stellen (Auslöschung). expm1() verwendet intern einen speziellen Algorithmus, der dieses Problem umgeht und das korrekte Ergebnis berechnet.
Die Funktion ist besonders nützlich in wissenschaftlichen, finanzmathematischen oder statistischen Berechnungen, z. B. bei der Berechnung von Wachstumsraten, Wahrscheinlichkeitsmodellen oder bei der Implementierung von Aktivierungsfunktionen in neuronalen Netzen (z. B. softplus).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | float | Der Exponent, für den enum - 1 berechnet werden soll. Besonders präzise für Werte nahe bei 0. |
Rückgabewert
enum - 1 als float zurück. Für num = 0 ist das Ergebnis exakt 0.0. Bei sehr großen positiven Werten kann INF zurückgegeben werden.Beispiele
Vergleich mit naiver Berechnung bei kleinem Exponent
<?php
$x = 1e-10;
// Naive Berechnung – Auslöschungsfehler!
$naive = exp($x) - 1;
echo 'Naive: ' . number_format($naive, 20, '.', '') . PHP_EOL;
// Genaue Berechnung mit expm1
$precise = expm1($x);
echo 'expm1: ' . number_format($precise, 20, '.', '') . PHP_EOL;
// Mathematisch korrekter Wert: ~1.00000000005e-10
echo 'Erwartet: 0.00000000010000000001' . PHP_EOL;
Anwendungsbeispiel: Berechnung von stetiger Verzinsung
<?php
// Stetige Verzinsung: Endkapital = K0 * exp(r * t)
// Zinsgewinn = K0 * (exp(r * t) - 1)
// Für sehr kleine Zinssätze r oder kurze Laufzeiten t ist expm1 wichtig
function zinszuwachs(float $kapital, float $zinssatz, float $laufzeitJahre): float {
return $kapital * expm1($zinssatz * $laufzeitJahre);
}
$kapital = 10000.0;
$zinssatz = 0.0001; // 0.01 % p.a. – sehr kleiner Satz
$laufzeit = 0.5; // halbes Jahr
$zuwachs = zinszuwachs($kapital, $zinssatz, $laufzeit);
printf("Zinszuwachs: %.6f EUR\n", $zuwachs);
// Wichtig · Fallstricke
Numerische Stabilität: Verwende grundsätzlich expm1() statt exp($x) - 1, wenn $x sehr klein sein kann (z. B. < 1e-5). Bei größeren Werten macht es praktisch keinen Unterschied, schadet aber auch nicht.
INF und NAN: Sehr große positive Argumente (z. B. 1e308) können INF liefern. Negative Argumente gegen -INF liefern -1.0 (da e-∞ - 1 = 0 - 1 = -1). Ungültige Eingaben wie NAN geben NAN zurück.