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

Math.asinh()

Methode

Die statische Methode <code>Math.asinh()</code> gibt den inversen hyperbolischen Sinus (Areasinus hyperbolicus) einer Zahl zurück.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Math.asinh(x)

Beschreibung

Math.asinh(x) berechnet den Areasinus hyperbolicus von x, also den Wert y, für den Math.sinh(y) === x gilt. Mathematisch entspricht das ln(x + √(x² + 1)). Die Funktion ist für alle reellen Zahlen definiert, streng monoton steigend und ungerade: Math.asinh(-x) === -Math.asinh(x).

Da asinh eine statische Methode von Math ist, wird sie immer als Math.asinh() aufgerufen und nicht über eine Instanz. Das Argument wird vorher mit der üblichen Zahlenumwandlung (ToNumber) in eine Zahl umgewandelt.

In der Praxis nutzt man Math.asinh() in Physik und Geometrie (z. B. Kettenlinie, Bogenlänge einer Parabel, Rapidität), aber auch in der Datenvisualisierung: Die asinh-Transformation verhält sich für große Beträge wie ein Logarithmus, ist aber im Gegensatz zu Math.log() auch für 0 und negative Werte definiert. Das macht sie zu einer beliebten Skala für Daten mit Vorzeichen und großem Wertebereich.

Gegenüber der „händischen“ Formel mit Math.log() und Math.sqrt() ist die eingebaute Methode numerisch deutlich robuster, besonders bei sehr kleinen und bei großen negativen Werten.

Parameter

Name Typ Default Beschreibung
$x Pflicht number Die Zahl, deren inverser hyperbolischer Sinus berechnet werden soll. Nicht-numerische Werte werden in eine Zahl umgewandelt (z. B. "2" → 2).

Rückgabewert

Typ
number
Beschreibung
Der inverse hyperbolische Sinus von x. Bei ±Infinity kommt ±Infinity zurück, bei ±0 dasselbe vorzeichenbehaftete ±0, und NaN, wenn sich das Argument nicht in eine Zahl umwandeln lässt.

Beispiele

Grundlegende Werte

console.log(Math.asinh(0));         // 0
console.log(Math.asinh(1));         // 0.881373587019543
console.log(Math.asinh(-1));        // -0.881373587019543
console.log(Math.asinh(2));         // 1.4436354751788103
console.log(Math.asinh(Infinity));  // Infinity
console.log(Math.asinh("abc"));     // NaN
0 0.881373587019543 -0.881373587019543 1.4436354751788103 Infinity NaN

Umkehrung von Math.sinh()

const winkel = 3;
const sinusH = Math.sinh(winkel);
const zurueck = Math.asinh(sinusH);

// Wegen Gleitkomma-Rundung besser gerundet vergleichen
console.log(zurueck.toFixed(10));
console.log(Math.abs(zurueck - winkel) < Number.EPSILON * 10);
3.0000000000 true

asinh-Skala für Diagrammdaten mit Vorzeichen

// Wie eine Log-Skala, aber auch für 0 und negative Werte gültig
const messwerte = [-1000, -10, 0, 10, 1000];

const skaliert = messwerte.map((wert) => Math.asinh(wert).toFixed(2));
console.log(skaliert);

// Math.log würde hier scheitern:
console.log(messwerte.map((wert) => Math.log(wert)));
[ '-7.60', '-3.00', '0.00', '3.00', '7.60' ] [ NaN, NaN, -Infinity, 2.302585092994046, 6.907755278982137 ]

Warum die eingebaute Methode genauer ist

// Naive Formel: ln(x + sqrt(x² + 1))
const asinhNaiv = (x) => Math.log(x + Math.sqrt(x * x + 1));

// Sehr kleine Werte: Auslöschung
console.log(asinhNaiv(1e-20));   // 0
console.log(Math.asinh(1e-20));  // 1e-20

// Große negative Werte: x + sqrt(...) wird 0
console.log(asinhNaiv(-1e10));             // -Infinity
console.log(Math.asinh(-1e10).toFixed(6)); // -23.718998
0 1e-20 -Infinity -23.718998

// Wichtig · Fallstricke

  • Genauigkeit: Das Ergebnis hängt von der Implementierung ab. Die Spezifikation schreibt kein bitgenaues Ergebnis vor, deshalb können sich die letzten Nachkommastellen zwischen Engines (V8, SpiderMonkey, JavaScriptCore) unterscheiden. Vergleiche daher mit einer Toleranz, nicht mit ===.
  • Keine eigene Formel verwenden: Math.log(x + Math.sqrt(x * x + 1)) liefert bei sehr kleinen x durch Auslöschung 0, bei großen negativen x -Infinity und kann bei sehr großen x durch x * x überlaufen.
  • Vorzeichen der Null: Math.asinh(-0) ergibt -0. Das spielt bei Divisionen eine Rolle (1 / -0 === -Infinity) und lässt sich mit Object.is() prüfen.
  • Typumwandlung: Math.asinh(null) ergibt 0, Math.asinh(undefined) ergibt NaN. BigInt-Werte lösen einen TypeError aus.
  • Kompatibilität: Seit ES2015 in allen modernen Browsern und in Node.js verfügbar. Der Internet Explorer unterstützt die Methode nicht; dort braucht man ein Polyfill.