JavaScriptsMathematik

Anzahl der Stellen von Potenzen kalkulieren

Ermittelt, wie viele Ziffern eine Potenz hat — ohne die Potenz selbst auszurechnen.

Mit diesem Script von unserem User Ivan lässt sich die Anzahl der Stellen einer beliebigen Potenz bestimmen. Das Besondere daran: Die Potenz selbst wird gar nicht ausgerechnet. Das wäre bei großen Exponenten auch aussichtslos — 2 hoch 10.000.000 ist eine Zahl mit über drei Millionen Ziffern, die kein Taschenrechner und kein normaler Datentyp fassen kann. Die Stellenanzahl dagegen ist mit einer einzigen Logarithmus-Rechnung in Sekundenbruchteilen da.

Die Bedienung: Ins erste Feld kommt die Basis, ins zweite der Exponent — also die hochgestellte Zahl. Wollt ihr wissen, wie viele Stellen 2^10000000 hat (das Zeichen ^ steht dabei für „hoch"), tragt ihr oben 2 und unten 10000000 ein und klickt auf „Anzahl der Stellen berechnen". Vorbelegt ist genau dieses Beispiel.

Ein typischer Anwendungsfall: Damit lässt sich nachprüfen, ob die im Internet kursierenden Angaben zu Mersenne-Primzahlen stimmen. Mersenne-Primzahlen haben die Form 2 hoch p minus 1, wobei p selbst prim ist; die größten bekannten haben zweistellige Millionenbeträge an Ziffern. Wer die Stellenzahl einer solchen Zahl im Kopf hat, kann sie hier in Sekunden gegenprüfen.

Wichtig zu wissen: Das Ergebnis ist ein Näherungswert. Es kann um plus oder minus eine Stelle vom tatsächlichen Wert abweichen, weil der Rechner den Logarithmus nur mit begrenzter Genauigkeit speichert und sich dieser winzige Fehler bei riesigen Exponenten aufsummiert. Für die Größenordnung reicht es allemal.

Im selben Fach findet ihr auch Scripts, die große Zahlen tatsächlich ausrechnen, etwa den Fakultätsrechner, die beliebige Wurzel und die Zahl quadrieren.

Mathematik Baujahr 2009 läuft in deinem Browser

Näherungswert — die Angabe kann um eine Stelle abweichen.

Eingesandt von Ivan

So funktioniert das Script

Das Script ist kurz: Es liest zwei Eingabefelder aus, prüft sie, rechnet eine einzige Formel und schreibt das Ergebnis in die Ausgabefläche. Der ganze Reiz steckt in dieser einen Formel — deshalb lohnt es sich, sie in Ruhe auseinanderzunehmen. Alles steckt in einer sofort ausgeführten Funktion, damit die Namen im Script nicht mit anderen Scripts der Seite kollidieren.

function zahl(id) {
  return Number(document.getElementById(id).value.replace(",", "."));
}

Die Hilfsfunktion zahl() holt sich ein Eingabefeld anhand seiner id, liest den eingetippten Text aus und macht daraus mit Number() eine echte Zahl. replace(",", ".") tauscht vorher ein deutsches Dezimalkomma gegen einen Punkt, denn JavaScript versteht intern nur die englische Schreibweise.

if (basis <= 0) {
  ausgabe.textContent = "Die Basis muss größer als 0 sein.";
  return;
}

Diese Prüfung ist keine Förmlichkeit, sondern mathematisch nötig: Der Logarithmus ist nur für positive Zahlen definiert. Math.log(0) liefert minus unendlich, Math.log(-5) liefert NaN („keine Zahl") — beides würde als unbrauchbares Ergebnis durchrutschen. Deshalb bricht das Script hier mit einem freundlichen Hinweis ab, statt Unsinn anzuzeigen.

const stellen = Math.floor(Math.log(basis) * exponent * Math.LOG10E + 1);

Das ist der Kern. Dahinter steckt eine Rechenregel für Logarithmen: Der Logarithmus einer Potenz ist der Exponent mal der Logarithmus der Basis. Und der Zehnerlogarithmus einer Zahl sagt, wie viele Stellen sie hat — die zehnstellige Zahl 1.000.000.000 hat den Zehnerlogarithmus 9, jede zehnstellige Zahl liegt also zwischen 9 und 10. Wer den Logarithmus abrundet und 1 dazuzählt, bekommt die Stellenanzahl.

Im Code taucht der Zehnerlogarithmus nicht direkt auf. Math.log() ist der natürliche Logarithmus zur Basis e, und Math.LOG10E ist eine fest eingebaute Konstante mit dem Wert 0,4342944819… — genau der Faktor, mit dem man einen natürlichen Logarithmus in einen Zehnerlogarithmus umrechnet. Für 2 hoch 10.000.000 ergibt das: 0,693 × 10.000.000 × 0,4343 ≈ 3.010.299,96, aufgerundet um die eine hinzugezählte Stelle also 3.010.300 Ziffern. Math.floor() schneidet dabei die Nachkommastellen ab.

Hier steckt auch die angekündigte Unschärfe: Der Rechner speichert 0,693 und 0,4343 nur mit etwa fünfzehn genauen Stellen. Bei einem Exponenten in Millionenhöhe wird dieser winzige Rundungsfehler mit vergrößert und kann das Ergebnis um eine Stelle verschieben.

ausgabe.innerHTML =
  basis + " hoch " + exponent + " hat ungefähr <strong>" +
  stellen.toLocaleString("de-DE") + "</strong> Stellen";

toLocaleString("de-DE") setzt die deutschen Tausenderpunkte, aus 3010300 wird also die viel besser lesbare 3.010.300. Weil das Ergebnis per innerHTML gesetzt wird, darf die Zahl in <strong>-Tags stehen und erscheint hervorgehoben.

Zum Anpassen: Wollt ihr die Stellenzahl im Binärsystem statt im Dezimalsystem wissen — also wie viele Bits die Zahl belegt — ersetzt ihr Math.LOG10E durch Math.LOG2E. Und wer die Formel lieber ohne Umrechnungskonstante liest, kann in modernen Browsern schlicht Math.log10(basis) * exponent schreiben; das Ergebnis ist dasselbe.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Mathematik