Start · Sprachen · JavaScript · Referenz · Math.expm1()

Math.expm1()

Methode

Gibt <code>e^x - 1</code> zurück und ist bei Werten von <code>x</code> nahe 0 deutlich genauer als <code>Math.exp(x) - 1</code>.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Math.expm1(x)

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

Typ
number
Beschreibung
Der Wert 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
0 1.718281828459045 -0.6321205588285577 -1 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
1.000000082740371e-10 1.00000000005e-10

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));
0.273973

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));
1e-8 1e-8

// Wichtig · Fallstricke

  • Genauigkeit: Nimm für kleine |x| (etwa < 1e-5) immer Math.expm1(x) statt Math.exp(x) - 1. Sonst verliert das Ergebnis durch Auslöschung viele Stellen oder wird sogar zu 0.
  • Überlauf: Ab etwa x > 709.78 ist das Ergebnis Infinity. 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 einen TypeError aus. Andere Werte laufen implizit durch Number().
  • 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.