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

Math.sinh()

Methode

Die statische Methode <code>Math.sinh()</code> gibt den hyperbolischen Sinus einer Zahl zurück, also <code>(eˣ − e⁻ˣ) / 2</code>.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Math.sinh(x)

Beschreibung

Math.sinh() berechnet den hyperbolischen Sinus des übergebenen Werts. Mathematisch gilt sinh(x) = (eˣ − e⁻ˣ) / 2. Die Funktion ist ungerade (sinh(−x) = −sinh(x)), streng monoton steigend und bildet die reellen Zahlen vollständig auf die reellen Zahlen ab.

Da sinh() eine statische Methode von Math ist, ruft man sie immer als Math.sinh() auf und nicht über ein selbst erzeugtes Objekt. Math ist kein Konstruktor.

Gebraucht wird die Funktion vor allem in Physik, Technik und Grafik: zum Beispiel bei Kettenlinien (Seile, Brückenbögen), in der speziellen Relativitätstheorie (Rapidität), bei Wärmeleitung und Wellengleichungen, in der hyperbolischen Geometrie und bei einigen Easing- und Kurvenfunktionen für Animationen.

Argumente, die keine Zahl sind, werden vorher per Number()-Umwandlung in eine Zahl umgewandelt. Für sehr große Beträge wächst das Ergebnis exponentiell und läuft schon ab etwa |x| > 710 nach ±Infinity über.

Parameter

Name Typ Default Beschreibung
$x Pflicht number Die Zahl, deren hyperbolischer Sinus berechnet werden soll. Andere Typen werden per Number() umgewandelt.

Rückgabewert

Typ
number
Beschreibung
Der hyperbolische Sinus von x. Bei NaN oder nicht umwandelbaren Werten kommt NaN zurück, bei ±0 dasselbe vorzeichenbehaftete ±0, bei ±Infinity ebenfalls ±Infinity.

Beispiele

Grundlegende Werte

console.log(Math.sinh(0));        // 0
console.log(Math.sinh(1));        // (e - 1/e) / 2
console.log(Math.sinh(-1));       // ungerade Funktion
console.log(Math.sinh(Infinity));
console.log(Math.sinh('2'));      // String wird umgewandelt
console.log(Math.sinh('abc'));
0 1.1752011936438014 -1.1752011936438014 Infinity 3.626860407847019 NaN

Kettenlinie (Durchhang eines Seils) berechnen

// Kettenlinie: y = a * cosh(x / a); Bogenlänge: s = a * sinh(x / a)
const bogenlaenge = (a, x) => a * Math.sinh(x / a);

// Seil zwischen zwei Masten im Abstand 20 m, Parameter a = 15
const halbeSpannweite = 10;
const a = 15;
const laenge = 2 * bogenlaenge(a, halbeSpannweite);

console.log(`Benötigte Seillänge: ${laenge.toFixed(2)} m`);
Benötigte Seillänge: 21.52 m

Zusammenhang mit cosh() und tanh() prüfen

const x = 0.75;
const sinh = Math.sinh(x);
const cosh = Math.cosh(x);

// Identität: cosh² − sinh² = 1
console.log((cosh ** 2 - sinh ** 2).toFixed(12));

// tanh = sinh / cosh
console.log(Math.abs(Math.tanh(x) - sinh / cosh) < Number.EPSILON);

// Umkehrfunktion asinh
console.log(Math.asinh(sinh));
1.000000000000 true 0.75

Fallback für sehr alte Umgebungen (Polyfill)

const sinh = Math.sinh ?? ((x) => {
  x = Number(x);
  if (x === 0 || !Number.isFinite(x)) return x; // behält ±0 und ±Infinity
  const e = Math.exp(x);
  return (e - 1 / e) / 2;
});

console.log(sinh(2));
3.626860407847019

// Wichtig · Fallstricke

  • Überlauf: Ab etwa |x| > 710.47 liefert Math.sinh() ±Infinity. Vor Divisionen oder Vergleichen ggf. mit Number.isFinite() prüfen.
  • Genauigkeit bei kleinen Werten: Die naive Formel (Math.exp(x) - Math.exp(-x)) / 2 verliert bei sehr kleinem x durch Auslöschung stark an Genauigkeit. Math.sinh() selbst oder Math.expm1() ((Math.expm1(x) - Math.expm1(-x)) / 2) sind hier deutlich genauer.
  • Implementierungsabhängigkeit: Die Spezifikation schreibt das Ergebnis nicht bitgenau vor. Die letzten Nachkommastellen können sich zwischen Engines (V8, SpiderMonkey, JavaScriptCore) unterscheiden. Gleitkommaergebnisse also nicht mit === vergleichen, sondern mit Toleranz.
  • Kein Winkel: Anders als bei Math.sin() ist das Argument kein Winkel im Bogenmaß im üblichen Sinn. Eine Umrechnung aus Grad ist hier sinnlos.
  • BigInt: Wer ein BigInt übergibt, bekommt einen TypeError.
  • Kompatibilität: Seit ES2015 in allen modernen Browsern und in Node.js verfügbar (Baseline). Nur der Internet Explorer braucht einen Polyfill.