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

Math.log2()

Methode

Die statische Methode <code>Math.log2()</code> gibt den Logarithmus einer Zahl zur Basis 2 zurück.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Math.log2(x)

Beschreibung

Math.log2(x) berechnet den Exponenten y, für den 2 ** y === x gilt. Weil log2 eine statische Methode von Math ist, ruft man sie immer als Math.log2() auf. Math ist kein Konstruktor, deshalb gibt es keine Instanzen.

Typische Einsatzgebiete sind die Informatik und die Bitverarbeitung: die Anzahl der Bits ermitteln, die für einen Wertebereich nötig sind, prüfen, ob eine Zahl eine Zweierpotenz ist, die Tiefe eines Binärbaums berechnen, Informationsgehalt und Entropie in Bit bestimmen oder Mipmap-Stufen in WebGL berechnen.

Das Argument wird zuerst in eine Zahl umgewandelt. Für Werte kleiner als 0 ist das Ergebnis NaN. Für 0 und -0 ist es -Infinity, für 1 ist es 0 und für Infinity ist es Infinity.

Parameter

Name Typ Default Beschreibung
$x Pflicht number Eine Zahl größer oder gleich 0. Andere Typen werden in eine Zahl umgewandelt (z. B. wird "8" zu 8).

Rückgabewert

Typ
number
Beschreibung
Der Logarithmus von x zur Basis 2. Für x < 0 oder nicht umwandelbare Werte ist das Ergebnis NaN, für 0 ist es -Infinity.

Beispiele

Grundlegende Werte und Randfälle

console.log(Math.log2(8));
console.log(Math.log2(1024));
console.log(Math.log2(1));
console.log(Math.log2(0.5));
console.log(Math.log2(0));
console.log(Math.log2(-2));
console.log(Math.log2("16"));
3 10 0 -1 -Infinity NaN 4

Benötigte Bits für einen Wertebereich berechnen

// Wie viele Bits braucht man, um n verschiedene Werte zu codieren?
const bitsNeeded = (n) => (n <= 1 ? 0 : Math.ceil(Math.log2(n)));

console.log(bitsNeeded(256));   // 1 Byte
console.log(bitsNeeded(1000));
console.log(bitsNeeded(65536));
8 10 16

Zweierpotenz prüfen und nächste Zweierpotenz finden

const isPowerOfTwo = (n) => n > 0 && Number.isInteger(Math.log2(n));
const nextPowerOfTwo = (n) => 2 ** Math.ceil(Math.log2(n));

console.log(isPowerOfTwo(64));
console.log(isPowerOfTwo(100));
// z. B. für die Texturgröße in WebGL
console.log(nextPowerOfTwo(300));
true false 512

Shannon-Entropie eines Textes in Bit

const entropy = (text) => {
  const counts = {};
  for (const ch of text) counts[ch] = (counts[ch] ?? 0) + 1;
  const len = [...text].length;
  return Object.values(counts).reduce((sum, c) => {
    const p = c / len;
    return sum - p * Math.log2(p);
  }, 0);
};

console.log(entropy("aaaa").toFixed(2));
console.log(entropy("abcd").toFixed(2));
0.00 2.00

// Wichtig · Fallstricke

  • Gleitkomma-Genauigkeit: Die Spezifikation schreibt die Genauigkeit nicht vor, sie kann sich also zwischen Engines unterscheiden. Für exakte Zweierpotenzen liefern gängige Engines exakte Ganzzahlen. Bei sehr großen Werten nahe einer Zweierpotenz kann die Rundung aber daneben liegen (z. B. kann Math.log2(2 ** 53 - 1) genau 53 ergeben). Math.floor(Math.log2(n)) ist deshalb bei großen Zahlen nicht immer verlässlich.
  • Ganzzahlige Bitlänge: Für 32-Bit-Ganzzahlen ist 31 - Math.clz32(n) schneller und exakt. Bei BigInt funktioniert Math.log2() nicht (TypeError). Dort hilft n.toString(2).length - 1.
  • Negative Argumente ergeben NaN, keine Exception. Prüfe Eingaben deshalb vorher selbst.
  • Ältere Alternative: Math.log(x) / Math.LN2. Sie ist ungenauer als Math.log2(), z. B. ergibt Math.log(8) / Math.LN2 in manchen Engines 2.9999999999999996.
  • Kompatibilität: ES2015, in allen modernen Browsern und in Node.js verfügbar. Der Internet Explorer unterstützt die Methode nicht.