Signatur
Beschreibung
Math.atanh() berechnet den Areatangens hyperbolicus von x, also den Wert y, für den Math.tanh(y) === x gilt. Mathematisch ist das ½ · ln((1 + x) / (1 − x)). Die Funktion ist nur für -1 < x < 1 endlich; an den Rändern liefert sie ±Infinity, außerhalb davon NaN.
Weil atanh eine statische Methode von Math ist, ruft man sie immer als Math.atanh() auf. Math ist kein Konstruktor und kann nicht instanziiert werden.
Typische Einsatzgebiete:
- Statistik: Die Fisher-z-Transformation eines Korrelationskoeffizienten
rist genauatanh(r). Damit lassen sich Konfidenzintervalle berechnen. - Maschinelles Lernen: Umkehrung einer
tanh-Aktivierung, um aus einer Ausgabe den ursprünglichen Wert zurückzurechnen. - Physik: Umrechnung einer Geschwindigkeit in die Rapidität,
φ = atanh(v / c), in der speziellen Relativitätstheorie.
Das Argument wird vorher mit ToNumber umgewandelt. Strings wie "0.5" funktionieren deshalb, nicht-numerische Werte ergeben NaN. Ein BigInt löst einen TypeError aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $x Pflicht | number | Eine Zahl. Endliche Ergebnisse gibt es nur für -1 < x < 1. Andere Typen werden in eine Zahl umgewandelt. |
Rückgabewert
x. Bei x === 1 ist das Ergebnis Infinity, bei x === -1 ist es -Infinity. Für |x| > 1 oder nicht-numerische Eingaben kommt NaN heraus. Das Vorzeichen von -0 bleibt erhalten.Beispiele
Grundlegende Werte und Randfälle
console.log(Math.atanh(0)); // 0
console.log(Math.atanh(0.5)); // ≈ 0.5493
console.log(Math.atanh(-0)); // -0
console.log(Math.atanh(1)); // Infinity
console.log(Math.atanh(-1)); // -Infinity
console.log(Math.atanh(2)); // NaN
console.log(Math.atanh('0.5')); // Umwandlung aus String
Fisher-z-Transformation für ein Konfidenzintervall
// 95-%-Konfidenzintervall für einen Korrelationskoeffizienten r bei n Stichproben
const correlationCI = (r, n, zCrit = 1.96) => {
const z = Math.atanh(r); // Fisher-z
const se = 1 / Math.sqrt(n - 3); // Standardfehler
return [Math.tanh(z - zCrit * se), Math.tanh(z + zCrit * se)]
.map((v) => Number(v.toFixed(3)));
};
console.log(correlationCI(0.6, 50));
Rapidität aus Geschwindigkeit (Relativitätstheorie)
const C = 299_792_458; // Lichtgeschwindigkeit in m/s
const rapidity = (v) => Math.atanh(v / C);
// Rapiditäten sind additiv, Geschwindigkeiten nicht
const addVelocities = (v1, v2) => Math.tanh(rapidity(v1) + rapidity(v2)) * C;
const result = addVelocities(0.5 * C, 0.5 * C);
console.log((result / C).toFixed(2)); // Bruchteil von c
tanh-Aktivierung umkehren, abgesichert
// Werte knapp an ±1 abschneiden, damit nicht Infinity entsteht
const EPS = 1e-12;
const inverseTanh = (y) => {
const clamped = Math.min(1 - EPS, Math.max(-1 + EPS, y));
return Math.atanh(clamped);
};
console.log(inverseTanh(Math.tanh(1.5)));
console.log(Number.isFinite(inverseTanh(1)));
// Wichtig · Fallstricke
- Definitionsbereich: Werte mit
|x| > 1werfen keinen Fehler, sondern liefern stillschweigendNaN. Bei unsicheren Eingaben sollte man das Ergebnis mitNumber.isFinite()prüfen. - Genauigkeit: Nahe ±1 wächst das Ergebnis sehr schnell. Schon kleine Rundungsfehler in
x, etwa ausMath.tanh(), verändern das Ergebnis deutlich. Deshalb liefertMath.atanh(Math.tanh(20))Infinity, weilMath.tanh(20)auf genau1gerundet wird. - Die Genauigkeit hängt von der Implementierung ab. Ergebnisse können zwischen Engines in der letzten Stelle voneinander abweichen.
- BigInt wird nicht unterstützt und löst einen
TypeErroraus. - Kompatibilität: Läuft in allen modernen Browsern und in Node.js, nicht aber im Internet Explorer. Ein Polyfill wäre
Math.atanh = Math.atanh || ((x) => Math.log((1 + x) / (1 - x)) / 2);, ist aber für kleinexweniger genau.