Signatur
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
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'));
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`);
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));
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));
// Wichtig · Fallstricke
- Überlauf: Ab etwa
|x| > 710.47liefertMath.sinh()±Infinity. Vor Divisionen oder Vergleichen ggf. mitNumber.isFinite()prüfen. - Genauigkeit bei kleinen Werten: Die naive Formel
(Math.exp(x) - Math.exp(-x)) / 2verliert bei sehr kleinemxdurch Auslöschung stark an Genauigkeit.Math.sinh()selbst oderMath.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 einenTypeError. - Kompatibilität: Seit ES2015 in allen modernen Browsern und in Node.js verfügbar (Baseline). Nur der Internet Explorer braucht einen Polyfill.