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

Math.atanh()

Methode

Gibt den inversen hyperbolischen Tangens (Areatangens hyperbolicus) einer Zahl <code>x</code> im Bereich −1 bis 1 zurück.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Math.atanh(x)

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 r ist genau atanh(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

Typ
number
Beschreibung
Der inverse hyperbolische Tangens von 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
0 0.5493061443340548 -0 Infinity -Infinity NaN 0.5493061443340548

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));
[ 0.386, 0.753 ]

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
0.80

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)));
1.4999999999999996 true

// Wichtig · Fallstricke

  • Definitionsbereich: Werte mit |x| > 1 werfen keinen Fehler, sondern liefern stillschweigend NaN. Bei unsicheren Eingaben sollte man das Ergebnis mit Number.isFinite() prüfen.
  • Genauigkeit: Nahe ±1 wächst das Ergebnis sehr schnell. Schon kleine Rundungsfehler in x, etwa aus Math.tanh(), verändern das Ergebnis deutlich. Deshalb liefert Math.atanh(Math.tanh(20)) Infinity, weil Math.tanh(20) auf genau 1 gerundet 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 TypeError aus.
  • 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 kleine x weniger genau.