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

Math.tanh()

Methode

Die statische Methode <code>Math.tanh()</code> gibt den hyperbolischen Tangens einer Zahl zurück – immer ein Wert zwischen -1 und 1.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Math.tanh(x)

Beschreibung

Math.tanh(x) berechnet den hyperbolischen Tangens von x, mathematisch definiert als (ex − e−x) / (ex + e−x) bzw. sinh(x) / cosh(x). Das Ergebnis liegt immer im offenen Intervall (−1, 1) und nähert sich bei großen Beträgen von x asymptotisch den Werten 1 bzw. −1.

Da tanh eine statische Methode von Math ist, ruft man sie immer als Math.tanh() auf. Math ist kein Konstruktor und wird nicht instanziiert.

Typische Einsatzgebiete sind Aktivierungsfunktionen in neuronalen Netzen, weiches Begrenzen („Soft Clipping“) von Werten, etwa in der Audioverarbeitung oder bei Animationen, sowie Easing-Kurven, die sanft in einen Grenzwert übergehen. Im Unterschied zu einem harten Abschneiden mit Math.min/Math.max ist der Übergang stetig und differenzierbar.

Das Argument wird vorher in eine Zahl umgewandelt. Werte, die sich nicht umwandeln lassen, ergeben NaN.

Parameter

Name Typ Default Beschreibung
$x Pflicht number Die Zahl, deren hyperbolischer Tangens berechnet wird. Andere Typen werden per Number()-Umwandlung in eine Zahl umgewandelt.

Rückgabewert

Typ
number
Beschreibung
Der hyperbolische Tangens von x im Bereich −1 bis 1. Sonderfälle: Math.tanh(Infinity) ergibt 1, Math.tanh(-Infinity) ergibt -1, -0 bleibt -0, und NaN oder nicht umwandelbare Werte ergeben NaN.

Beispiele

Grundlegende Werte und Sonderfälle

console.log(Math.tanh(0));         // 0
console.log(Math.tanh(1));         // 0.7615941559557649
console.log(Math.tanh(-1));        // -0.7615941559557649
console.log(Math.tanh(Infinity));  // 1
console.log(Math.tanh(-Infinity)); // -1
console.log(Math.tanh('0.5'));     // 0.46211715726000974
console.log(Math.tanh('abc'));     // NaN
0 0.7615941559557649 -0.7615941559557649 1 -1 0.46211715726000974 NaN

tanh als Aktivierungsfunktion eines Neurons

const neuron = (inputs, weights, bias) => {
  const sum = inputs.reduce((acc, x, i) => acc + x * weights[i], bias);
  return Math.tanh(sum);
};

// Ableitung für Backpropagation: 1 - tanh(x)^2
const tanhDerivative = (y) => 1 - y * y;

const out = neuron([0.5, -1.2, 3], [0.8, 0.1, 0.4], -0.2);
console.log(out.toFixed(4));
console.log(tanhDerivative(out).toFixed(4));
0.8318 0.3081

Soft Clipping für Audio-Samples

// Begrenzt übersteuerte Samples weich auf [-1, 1] statt hart abzuschneiden
const softClip = (samples, drive = 2) =>
  samples.map((s) => Math.tanh(s * drive));

const input = [0.1, 0.5, 1.2, -2.5];
console.log(softClip(input).map((v) => v.toFixed(3)));
[ '0.197', '0.762', '0.984', '-1.000' ]

Polyfill für sehr alte Umgebungen

if (!Math.tanh) {
  Math.tanh = (x) => {
    x = Number(x);
    if (x === Infinity) return 1;
    if (x === -Infinity) return -1;
    const e2x = Math.exp(2 * x);
    return (e2x - 1) / (e2x + 1);
  };
}

console.log(Math.tanh(0.5));
0.46211715726000974

// Wichtig · Fallstricke

  • Sättigung: Ab etwa |x| > 19 liefert Math.tanh wegen der Gleitkomma-Genauigkeit exakt 1 bzw. -1. Die Ableitung 1 - tanh² wird dann 0. In neuronalen Netzen ist das als „verschwindender Gradient“ bekannt.
  • Eigene Implementierung vermeiden: Die naive Formel (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)) ergibt bei großen Werten (z. B. x = 1000) Infinity / Infinity = NaN. Die eingebaute Methode behandelt diesen Fall korrekt.
  • Genauigkeit: Die Spezifikation schreibt das exakte Ergebnis nicht vor. Die letzten Nachkommastellen können sich deshalb zwischen Engines geringfügig unterscheiden.
  • Vorzeichen: Math.tanh(-0) ergibt -0. Das ist mit Object.is() erkennbar.
  • Kompatibilität: Wird seit ES2015 in allen modernen Browsern und in Node.js unterstützt. Nur der Internet Explorer braucht einen Polyfill.