Potenzen von 2


Potenzen von 2 mit Tabellen-Kalkulation


 ABC
1n2^n
20=2^A2=BigInt_New(B2)
3=A2+1=2*B2=BigInt_Mul2(C2)
4=A3+1=2*B3=BigInt_Mul2(C3)
 ⇓⇓
130=A129+1=2*B129=BigInt_Mul2(C129)



 ABC
1n2^n
2011
3122
4244
 ⇓⇓
5149562949953421312562949953421312
52501125899906842620 1125899906842624
53512251799813685250 2251799813685248
 ⇓⇓
130128 340282366920938000000000000000000000000 340282366920938463463374607431768211456

Ergebnisse

Die Werte von Spalte B wurden mit einem Standard Kalkulations-Programm berechnet.
Die exakten Werte von Spalte C wurden mit Hilfs-Funktionen in der Programmiersprache Basic berechnet.
Details zum Basic-Modul → BigInt, welches zur exakten Berechnung verwendet wurde.

Die ersten Zeilen sind leicht zu berechnen und IT-Insidern wohlbekannt.
Ab n>=50 wird die Verdoppelung mit Standard-Programmen nicht mehr korrekt berechnet.


Rechnen mit Zeichenketten

Alle modernen Programmiersprachen bieten Module zum Rechnen mit beliebiger Genauigkeit. Jede Zahl (z.B. 1234) wird als Zeichenkette (Text, String) von Ziffern gespeichert, z.B. als "1234"; und nicht wie sonst als binär gespeichertes Muster 10011010010
Rechnungen werden von solchen Funktionen schrittweise mit jeder einzelnen Ziffer ausgeführt, so wie man es in der Grundschule lernt und mit Bleistift & Papier noch immer macht.

Das verlangsamt alle Rechnungen um mehrere Größenordnungen, erlaubt aber fast beliebige Genauigkeit (Je nach String-Typ mindestens 2000 Ziffern meist 65000 Ziffern).

Auf dieser Seite werden Programme in den Programmiersprachen ↓ Perl und ↓ PHP vorgestellt, die das gleiche Beispiel mit 'unbegrenzter Genauigkeit' rechnen, d.h. mit Zeichenketten.
Auf einer eigenen Seite wird das ↓ Basic-Modul BigInt vorgestellt, mit dessen Funktionen man auch in der Tabellen-Kalkulation beliebig große ganzen Zahlen verwenden kann.

Weitere Experimente zur Live-Bestimmung der → Genauigkeit und der → Größten darstellbaren Zahl.

Wenn man mit Ziffern-Strings arbeitet, dann muss man alle Rechnungen innerhalb des Basic-Moduls ausführen. Lediglich die Vorgaben und Ergebnisse werden mit der Tabellen-Kalkulation ausgetauscht.

Das Basic-Modul BigInt bietet einige Funktionen zur Umwandlung von 'echten' Zahlen in Ziffern-Strings und umgekehrt. Wenn man Strings in Zahlen umwandelt, dann wird die Genauigkeit allerdings wieder auf 15-16 Dezimalstellen begrenzt.

Im oben gezeigten ↑ Kalkulations-Beispiel wird die 'BenutzerInnen-definierte' Funktion BigInt_New() verwendet, um einen einfachen Zahlenwert in einen Ziffern-String umzuwandeln. Danach werden die Werte aller Zellen der Spalte C von oben nach unten mit Funktion BigInt_Mul2() verdoppelt.

Potenzen von 2 mit PHP

▶  Mit diesem Link öffnen sie das PHP-Programm in einem eigenen Browser-Tab.

◀  Links sehen sie den PHP-Quelltext des Programms:
Es ist sehr einfach aufgebaut. Das ist nicht gleich erkennbar, weil die Kommentare den größten Teil des Programms einnehmen.

• Wenn man die Potenzen von 2 mit der PHP Standard-Funktion pow() berechnet, dann erhält man die gleichen Ergebnisse wie mit jedem anderen Standard-Programm: Nur die ersten 15-16 Dezimal-Stellen sind genau.

• Dieses Beispiel verwendet zur Potenzierung die Funktion bcpow() aus dem → PHP-Modul BCMath. Diese Funktion rechnet nicht mit dem Zahlen-Typ 'Double Precision' sondern mit Zeichenketten (Text) aus Ziffern. Das ist zwar wesentlich langsamer, erlaubt jedoch beliebige Genauigkeit.

Potenzen von 2 mit Perl

▶  Mit diesem Link öffnen sie das Perl-Programm in einem eigenen Browser-Tab.

◀  Links sehen sie den Perl-Quelltext des Programms:
Es ist genau gleich aufgebaut wie das oben gezeigte PHP-Programm.

• Perl bietet mehrere Funktionen zum Potenzieren, darunter auch die Standard Posix-Funktion pow()
Damit erhält man die gleichen Ergebnisse wie mit jedem anderen Standard-Programm: Nur dier ersten 15-16 Dezimal-Stellen sind genau.

• Dieses Beispiel verwendet an Stelle der Potenzierung die schrittweise Multiplikation mit Methode bmul(2) aus dem Perl-Modul Math::BigInt. Diese Funktion rechnet mit Zeichenketten aus Ziffern. Das ist zwar wesentlich langsamer, erlaubt jedoch beliebige Genauigkeit.