Signatur
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
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"));
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));
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));
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));
// 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)genau53ergeben).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. BeiBigIntfunktioniertMath.log2()nicht (TypeError). Dort hilftn.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 alsMath.log2(), z. B. ergibtMath.log(8) / Math.LN2in manchen Engines2.9999999999999996. - Kompatibilität: ES2015, in allen modernen Browsern und in Node.js verfügbar. Der Internet Explorer unterstützt die Methode nicht.