Start · Sprachen · PHP · Referenz · expm1

expm1

Funktion

Berechnet <code>exp(num) - 1</code> mit hoher numerischer Genauigkeit, auch wenn <code>num</code> sehr nahe bei Null liegt.

seit PHP 4.1.0 Kategorie: math

Signatur

expm1(float $num): float

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

Typ
float
Beschreibung
Gibt den Wert von 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;
Naive: 0.00000000010000000828 expm1: 0.00000000010000000001 Erwartet: 0.00000000010000000001

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);
Zinszuwachs: 0.500003 EUR

// 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.

Siehe auch