Signatur
Beschreibung
Math.expm1() berechnet ex − 1. Dabei ist e die Eulersche Zahl (≈ 2,71828). Weil expm1 eine statische Methode von Math ist, ruft man sie immer als Math.expm1() auf und nicht über eine Instanz.
Die Methode gibt es wegen der numerischen Genauigkeit. Ist x sehr klein, liegt Math.exp(x) sehr nahe bei 1. Zieht man dann 1 ab, gehen durch Auslöschung fast alle signifikanten Stellen verloren. Math.expm1() berechnet das Ergebnis direkt und behält die volle Genauigkeit einer Gleitkommazahl mit doppelter Genauigkeit.
Typische Einsatzgebiete sind Finanzmathematik (stetige Verzinsung bei kleinen Zinssätzen), Physik und Statistik (z. B. Exponentialverteilung, Wachstums- und Zerfallsmodelle) und die Berechnung hyperbolischer Funktionen wie sinh oder tanh für kleine Argumente. Die Umkehrfunktion ist Math.log1p().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $x Pflicht | number | Der Exponent. Andere Werte als Zahlen werden vorher in eine Zahl umgewandelt (z. B. "1" → 1, null → 0). |
Rückgabewert
ex − 1. Bei -Infinity ist das Ergebnis -1, bei Infinity ist es Infinity, bei 0 bzw. -0 kommt 0 bzw. -0 heraus. Nicht umwandelbare Werte ergeben NaN.Beispiele
Grundlegende Werte
console.log(Math.expm1(0)); // 0
console.log(Math.expm1(1)); // e - 1
console.log(Math.expm1(-1)); // 1/e - 1
console.log(Math.expm1(-Infinity)); // -1
console.log(Math.expm1('abc')); // NaN
Genauigkeit im Vergleich zu Math.exp(x) - 1
const x = 1e-10;
const naiv = Math.exp(x) - 1;
const genau = Math.expm1(x);
console.log(naiv); // Stellen gehen durch Auslöschung verloren
console.log(genau); // korrekt: ≈ x + x²/2
Stetige Verzinsung: Zinsertrag bei kleinem Zinssatz
// Ertrag = Kapital * (e^(r*t) - 1)
const zinsertrag = (kapital, zinssatz, jahre) =>
kapital * Math.expm1(zinssatz * jahre);
// 1 Mio. € bei 0,01 % Zinsen für 1 Tag
const ertrag = zinsertrag(1_000_000, 0.0001, 1 / 365);
console.log(ertrag.toFixed(6));
Genaues sinh für kleine Argumente
// sinh(x) = (e^x - e^-x) / 2 = (expm1(x) - expm1(-x)) / 2
const sinhGenau = (x) => (Math.expm1(x) - Math.expm1(-x)) / 2;
console.log(sinhGenau(1e-8));
console.log(Math.sinh(1e-8));
// Wichtig · Fallstricke
- Genauigkeit: Nimm für kleine
|x|(etwa < 1e-5) immerMath.expm1(x)stattMath.exp(x) - 1. Sonst verliert das Ergebnis durch Auslöschung viele Stellen oder wird sogar zu0. - Überlauf: Ab etwa
x > 709.78ist das ErgebnisInfinity. Für sehr negative Werte nähert es sich-1. - Plattformabhängigkeit: Die Spezifikation schreibt keinen exakten Algorithmus vor. Die letzten Nachkommastellen können sich deshalb zwischen Engines und Betriebssystemen unterscheiden.
- Typumwandlung:
BigInt-Werte lösen einenTypeErroraus. Andere Werte laufen implizit durchNumber(). - Kompatibilität: Die Methode ist Teil von ES2015 und wird von allen modernen Browsern und von Node.js unterstützt. Für den Internet Explorer braucht man ein Polyfill.