Die Kreiszahl Pi (π)

Berechnung der Kreiszahl Pi

Zielgruppe sind StudentInnen und ambitionierte Informatik-Amateure

Grundkenntnisse der Informatik und einer beliebigen Programmiersprache sind hilfreich.


Die Kreiszahl Pi (π)


Pi gibt für einen Kreis das Verhältnis des Umfangs (u) zum Durchmesser (d) an
π = u/d
Pi gibt auch das Verhältnis der Kreis-Fläche zur Fläche des umschriebenen Quadrats an:
π/4 = A[Kreis] / A[Quadrat]







Dieser interessante Entwurf scheiterte, obwohl der Erfinder Edward J. Goodwin dem Staat die kostenlose Nutzung dieser Erkenntnisse gestatten wollte.

Das griechische Zeichen  π


In einigen wichtigen Programm-Umgebungen kann man das Zeichen π so angeben:
  • LibreOffice mit Menü Einfügen / Sonderzeichen / Teilmenge=Basis-Griechisch /π
  • MS-Office (ältere Versionen): Einfügen / Symbol / Subset=Standardgriechisch / π
    (neuere Versionen): Einfügen / Symbol / (Weitere Symbole) / Subset=Griechisch und Koptisch / π
  • Tabellen-Kalkulation: Formel =ZEICHEN(960)
  • Basic: ChrW(960)
  • HTML: π oder π oder π
  • XML (MathML, SVG, etc.): π oder π
  • Javascript: "\u03C0" oder String.fromCharCode(960)
  • Perl oder PHP: chr(960) oder chr(0x3C0)

Details zur → Codierung von Umlauten und Sonderzeichen

Berechnung der Kreiszahl Pi nach Viète


Quelle: Wikimedia Commons (modif.)
Es gibt für die gleiche Aufgabe noch zahlreiche andere Algorithmen: Im Laufe der Geschichte haben sich viele große Mathematiker mit dieser Aufgabe beschäftigt.

Die hier vorgestellte Methode ist jedoch besonders einfach und effizient, und wird daher oft für Trainings-Aufgaben verwendet. Man kann sie u.a. mit jedem ↓ Tabellen-Kalkulations-Programm ausführen.
Die Schwierigkeit besteht nicht in der Berechnung sondern in der Umsetzung der abstrakten Formel in konkret berechenbare Anweisungen.

Es ist eine populäre Aufgabe, Pi auf besonders viele Stellen genau zu berechnen. Das Thema 'Genauigkeit' ist in der Informatik wichtig, jedoch bei den meisten IT-AnwenderInnen unbekannt. Der Algorithmus von Viète ist gut geeignet, um die Genauigkeit von Zahlen und Rechnungen zu demonstrieren.



Zur Programmierung eines 'intelligenten' Abbruchs ist es wichtig, die begrenzte ↓ Genauigkeit von Programmen zu kennen. Daraus ergibt sich, dass sich das Ergebnis einer Reihen-Entwicklung nach einer gewissen Anzahl von Schritten nicht mehr ändert. Man vergleicht daher jedes Ergebnis mit dem vorigen und bricht die Rechnung ab, wenn die Differenz=0 ist. Dieses Abbruch-Kriterium wird für die meisten Beispiele dieser Seite verwendet.

Leider erreichen nicht alle Reihen die Differenz=0
In manchen Algorithmen schwanken die Ergebnisse zyklisch um winzige Beträge. In diesen Fällen kann man z.B. eine (sehr kleine) Schranke festlegen: Wenn die Differenz von 2 aufeinander folgenden Ergebnissen unter die Schranke fällt, dann wird die Rechnung abgebrochen.


Andere Algorithmen

Im Laufe der Zeit wurden mehrere Algorithmen gefunden, welche ebenfalls die Berechnung der Kreiszahl Pi erlauben, z.B. jener von John Wallis (1655), von William Brouncker (1655), von Gottfried Wilhelm Leibnitz (1682), John Machin (1706), Leonhard Euler (1748), von Johann Heinrich Lambert (1770), von Stanley Rabinowitz (1991, anspruchsvoll !) oder von Bailey, Borwein & Plouffe (1996, mehrere Algorithmen)

Aufgabe für fortgeschrittene EntwicklerInnen: Programmieren sie den Algorithmus von Viète mit der Quadratwurzel nach Heron, oder einen der anderen angegebenen Algorithmen, ebenfalls mit Ersatz aller mathematischen Funktionen mit Ausnahme der 4 Grundrechnungs-Arten.



Alle Standard-Methoden der Informatik verwenden daher Pi (und alle anderen Gleitkomma-Zahlenwerte) mit einer Genauigkeit von 15 Dezimal-Stellen:
3.14159265358979

Alle modernen Programmiersprachen bieten Module zum Rechnen mit 'beliebiger' Genauigkeit: Die Ziffern (!) der Variablen werden in Zeichenketten (Strings) gespeichert, die Rechnungen werden genauso ausgeführt wie manuell mit Bleistift & Papier. Das ist zwar um mehrere Größenordnungen langsamer, aber für Aufgaben wie diese eine sinnvolle Methode.
Beispiele mit ↓ Perl oder ↓ PHP.

Die meisten 'Taschenrechner'-Programme (z.B. Windows calc.exe) verwenden andere Zahlen-Typen mit variabler oder höherer Genauigkeit. Daher funktioniert das links angegebene Demo-Beispiel mit typischen Taschenrechnern nicht.

Details zur Numerischen Genauigkeit in der praktischen Informatik
Wikipedia: Mantisse, Exponent, Double Precision, Viète

Pi in der Tabellen-Kalkulation



 AB
1r123
2u=2*B1*PI()
2A=B1*B1*PI()
Beispiel: Berechnung von Umfang und Fläche eines Kreises mit der Standard-Funktion PI()
Beispiel: Umrechnung eines Winkels, der in Zelle C1 im Gradmaß (0°..360°) angegeben ist, in das Bogenmaß:
=C1*PI()/180



Das folgende Programm berechnet Pi nach dem Algorithmus von Viète, kann damit jedoch prinzipiell nur die gleiche Genauigkeit von 15 Stellen erreichen.

 ABCDEFG
1SchrittZählerWurzelFaktor ProduktPiDiff
212=WURZEL(B2) =C2/2=D2=2/E2 
3=A2+1=2+C2=WURZEL(B3) =C3/2=E2*D3=2/E3=F3-F2
4=A3+1=2+C3)=WURZEL(B4) =C4/2=E3*D4=2/E4=F4-F3
 ⇓⇓⇓⇓ ⇓⇓⇓⇓⇓⇓ ⇓⇓⇓⇓
27=A26+1=2+C26)=WURZEL(B27) =C27/2=E26*D27=2/E27=F27-F26
Die Übersetzung des Algorithmus in ein Programm ist für wenig erfahrene AnwenderInnen ein kniffliges Problem. Danach ist die Programmierung jedoch besonders einfach:
Tragen sie die Formeln der ersten Zeilen (1 bis 3) ein.
Füllen sie danach alle weiteren Zellen von A3:G3 nach unten aus.


Ergebnis

Die Kreiszahl Pi wird in Spalte F schrittweise berechnet.
Mit dem 26. Schritt haben die Werte aller Spalten B:G ihre endgültigen Werte erreicht, die sich nicht mehr ändern. In der letzten Spalte (Diff) wird berechnet, um welchen Wert sich das Ergebnis (Pi) im jeweiligen Schritt geändert hat.

Man kann den besten Wert von Pi mit der Standard-Funktion vergleichen: Tragen sie in eine beliebige Zelle (z.B. in F30) die Formel =PI() ein:  Algorithmus und Formel ergeben meist den gleichen Wert
3.14159265358979
Dieser Wert ist auf 15 Dezimal-Ziffern genau, wie der Vergleich mit den weiteren folgenden Ziffern zeigt:
3.1415926535897932384626433832795...

Wenn ihr Programm nicht das gewünschte Ergebnis berechnet, dann können sie die Tabelle des Kapitels ↓ Javascript zur Fehler-Suche (Debuggen) verwenden: Dort sind die Zahlenwerte aller Zwischen-Ergebnisse angegeben.



Der Standard-Typ Double Precision' wird nicht nur von → Kalkulations-Programmen verwendet, sondern (derzeit) ohne besondere Vereinbarung von jedem Programm und jeder Programmiersprache.
Daher gilt diese relative Grenze der Genauigkeit für alle derzeit gängigen PC und alle Betriebssysteme.

• Manche Spezial-Programme bieten als Option die Verwendung anderer Typen, z.B. Quad Precision mit 113‑Bit Mantisse und damit einer relativen Genauigkeit von 9.63E-33
Das entspricht ca. 34 Dezimal-Ziffern.

• Alle modernen Programmiersprachen (z.B. ↓ Perl, ↓ PHP) bieten Module zum Rechnen mit beliebiger Genauigkeit. Dazu stellt man alle Zahlen als Zeichenkette (String, Text) aus Ziffern dar.
Die Rechnungen werden schrittweise ausgeführt - Genauso wie man es in der Grundschule lernt, oder ohne Computer mit Bleistift & Papier manuell berechnet.
Diese Methode eignet sich jedoch nur für spezielle Aufgaben, denn die Geschwindigkeit ist um mehrere Größenordnungen geringer als beim Rechnen mit den Standard Zahlen-Typen.

Pi in der Programmiersprache Basic


Für diese Anwendung braucht man keine besonderen Resourcen: Jedes Standard Tabellen-Kalkulations-Programm auf jedem gängigen Betriebssystem ist dazu geeignet.
Basic eignet sich daher gut zur Ausbildung wenig erfahrener EntwicklerInnen. In vielen Details, die über die Grundbegriffe hinausgehen, ist Basic allerdings nicht mehr Stand der Technik.



Am schnellsten wird mit einer Konstanten gerechnet: Definieren sie am Anfang (!) eines Basic-Moduls (vor globalen Variablen oder Funktionen):
Const PI = 3.141592653589794
Man kann mehr Stellen angeben, diese werden jedoch ignoriert. Kontrollieren sie diese Programm-Zeile genau, denn die nachfolgenden Funktionen rechnen gnadenlos auch mit PI=4



Das Ergebnis ist eine portable Funktion, die man als 'Benutzerinnen-definierte Funktion' in jedem Tabellen-Kalkulations-Programm verwenden kann.
Das hat allerdings nur didaktische Bedeutung, denn diese Funktion liefert im besten Fall das gleiche Ergebnis wie die Standard-Funktion =PI() der Tabellen-Kalkulation.



Die Vorbereitung und das Anlegen von Basic-Modulen wird in eigenen Seiten vorgestellt:
→ Basic-Module mit LibreOffice-Calc
→ Basic-Module mit MS-Excel

Nach der Programmiersung kann man die Kalkulations-Datei normal speichern und verwenden.
In neueren Versionen von MS-Excel muss man die Datei ausdrücklich im Format *.xlsm speichern.



Function pi_viete() As Double
Dim doloop As Boolean
Dim p, pv, z As Double
doloop = True
z = 0
p = 1
While (doloop)
pv = p
z = Sqr(2 + z)
p = p * z / 2
If (p = pv) Then doloop = False
Wend
pi_viete = 2 / p
End Function


Anregungen

Fortgeschrittene EntwicklerInnen können die Funktion weiter entwickeln, z.B.
  • Geben sie ein Argument an, mit dem man die Anzahl der zu berechnenden Elemente der Reihe vorgeben kann. Beispiel:
    =pi_viete(5)
    Mit dieser Formel sollen genau 5 Elemente der Reihe berechnet werden.
  • Machen sie das Argument optional: Wenn man es nicht angibt, dann soll bis zur maximalen Genauigkeit gerechnet werden.
    Details zu → optionalen Argumenten
  • Ergänzen sie eine Möglichkeit zur Analyse: Wenn man ein negatives Argument angibt
    =pi_viete(-1)
    dann soll die Funktion nicht das Ergebnis Pi zurückgeben sondern die Anzahl der Schleifen-Durchgänge bis zum Abbruch bei maximaler Genauigkeit.

Pi in der Programmiersprache Javascript


Javascript eignet sich besonders gut zur Ausbildung:
  • Man braucht zur Programmierung keine besonderen Resourcen: Ein beliebiger Browser und ein Text-Editor genügen. Daher kann man die Aufgaben ohne Vorbereitung an jedem gängigen Arbeits-PC ausführen.
  • Man muss sich nicht um das User-Interface kümmern: Schon mit minimalen Kenntnisen von → HTML kann man einfache Webseiten herstellen, mit denen man eigene Javascript-Programme ausprobieren kann.
  • Der Programmier-Zyklus ist kurz: Man kann Änderungen eines Programms sofort im Browser testen.
  • Javascript ist anderen modernen Programmiersprachen viel ähnlicher als z.B. ↑ Basic. Die Kenntnisse lassen sich daher gut auf jede andere moderne Programmiersprache übertragen.



Die Konstante Math.PI gibt den Wert von Pi auf 15 Dezimalstellen genau zurück, z.B. in dieser Mini-Funktion:
var pi = Math.PI;
alert('Pi='+pi);




 Schritt ElementProduktÄnderungPi
1????
2????
3????
4????
5????
6????
7????
8????
9????
10????
11????
12????
13????
14????
15????
16????
17????
18????
19????
20????
21????
22????
23????
24????
25????
26????
27????
28????

Zum Vergleich der theoretische Wert von Pi. Die korrekt berechneten Stellen sind grün angegeben:
3.1415926535897932384626433832795...

Live-Demonstration

Mit Javascript lässt sich der Algorithmus von Viète Live demonstrieren: Die Zahlenwerte der Tabelle wurden von ihrem Browser mit einer Javascript-Funktion Live berechnet.

Die Spalte Schritt zählt fortlaufend die Elemente des Algorithmus = Durchläufe der Berechnungs-Schleife.

In der Spalte Element werden alle Elemente der Reihe bis zu deren Abbruch angezeigt. Ihre Zahlenwerte nähern sich dem Wert=1, der theoretisch erst nach unendlich vielen Schritten erreicht wird.

In der Spalte Produkt werden die Werte des laufenden Produkts angezeigt. In der Schleife wird nur dieses Produkt als Zwischen-Ergebnis berechnet, nicht der endgültige Wert von Pi.

In der Spalte Änderung wird jener Wert angegeben, um den sich das Produkt beim letzten Schritt der Berechnung geändert hat. Man erkennt, dass die Änderung mit zunehmender Zahl der Schritte immer kleiner wird. Sie erreicht zwar theoretisch erst nach unendlich vielen Schritten den Wert=0, in der Praxis jedoch an der Grenze der Genauigkeit, d.h. hier nach 28 Schritten (in roter Schrift).

In der Spalte Pi wird das vom Algorithmus nach der jeweiligen Anzahl von Schritten berechnete Ergebnis angegeben. Man erkennt, dass die Genauigkeit schrittweise zunimmt, bis sie zuletzt den für den Variablen-Typ 'Double Precision' maximalen Wert von 15-16 Dezimal-Stellen annimmt.

Derartige Aufgaben fallen oft bei einfachen µProzessoren an, die nur die 4 Grundrechnungs-Arten beherrschen, z.B. bei der Berechnung von Winkelfunktionen (Bestimmung von Richtung, Lage oder Entfernung).


function pi_viete() {
var doloop,dp,p,pi,pv,z;
doloop = true;
z = 0;   p = 1;
while(doloop) {
pv = p;
z = Math.sqrt(2+z);
p *= z/2;
if(p==pv) {doloop=false;}
}
return 2/p;
}



Ausführungs-Zeit pro Berechnung von Pi:
t = ?µs
Bei wiederholter Anwendung wird das Javascript-Programm je nach Browser meist optimiert und daher schneller ausgeführt.
Details zur → Zeitnehmung mit Javascript

Pi in den Programmiersprachen C/C++


Ein fertig gestelltes (compiliertes) C/C++ Programm braucht im einfachsten Fall keinerlei zusätzliche Resourcen. Daher ist C/C++ ideal für einfache Microprozessoren geeignet, die in der Industrie und zunehmend auch in Konsum-Geräten viele Aufgaben übernehmen.



Wenn die angegebenen Konstanten fehlen, dann kann man sie selbst definieren:
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

Alternativ kann man eine eigene Konstante definieren, z.B.:
const double My_PI = 3.14159265358979323846;



Daher werden mathematische Funktionen meist selbst programmiert. Die Kreiszahl Pi wird zwar in realen Anwendungen als Konstante verwendet, das folgende Beispiel eignet sich jedoch zur Demonstration einer selbst programmierten mathematischen Funktion.

Die Funktion pi_viete() berechnet Pi nach dem Viète-Algorithmus. Auf die Verwendung der Standard-Funktion sqrt() wird verzichtet, zur Berechnung der Quadratwurzel wird der Heron-Algorithmus verwendet.


#include <stdio.h>
double pi_viete(void);
double sqrt_heron(double);

int main(){
double pi;
pi = pi_viete();
printf("Pi(Viete)=%18.16f",pi);
return 0;
}

double pi_viete(void) {
int doloop;
double p,pv,z;
doloop=1;  z=0;  p=1;
while(doloop) {
pv = p;
z = sqrt_heron(z+2.0);
p = p*z/2.0;
if(p==pv) {doloop=0;}<
}
return 2.0/p;
}

double sqrt_heron(double x) {
int doloop;
double y,yv;
if(x) {
y = x/2.0;
doloop = 1;
while(doloop) {
yv = y;
y = (y+x/y)/2.0;
if(y==yv) {doloop=0;}
}
}
else{y=0.0;}
return y;
}



Man muss daher (aus dem gleichen Quelltext) für jedes Betriebssystem, meist auch für verschiedene Versionen des gleichen Systems, und natürlich auch für jeden Mikroprozessor-Typ eine eigene Version des ausführbaren Programms herstellen.

Pi in der Programmiersprache Perl


Perl dient im technisch-wissenschaftlichen Bereich häufig als 'intelligenter Taschenrechner'. Man verzichtet auf ein User-Interface und programmiert spartanische Konsolen-Programme. Perl ist (mit etwas Erfahrung) einfach programmierbar, läuft sehr rasch und bietet (im Gegensatz zur Tabellen-Kalkulation) alle Möglichkeiten einer modernen Programmiersprache. Die meisten der Perl-Module wurden für diesen Anwendungs-Bereich entwickelt.

Man kann Perl als Alternative zu ↓ PHP einsetzen, d.h. zur Programmierung dynamischer Webseiten. Das funktioniert problemlos, wird aber selten verwendet.


Perl-Modul  Math::Trig

Dieses Modul enthält zahlreiche Konstanten und Funktionen der Trigonometrie. So wird das Modul eingebunden:
use Math::Trig ':pi';
Darin sind u.a. diese Konstanten definiert:
pi = π = 3.14159265358979
pi2 = 2*π = 6.28318530717959
pip2 = π/2 = 1.5707963267949
pip4 = π/4 = 0.785398163397448



Der Umfang solch einfacher Programme vergrößert sich erheblich, wenn man Wert auf ein bequem bedienbares Programm (User-Interface) legt:

Mit diesem Link wird eine mit Perl programmierte Mini-Webseite geöffnet, welche Pi mit 'beliebiger' Genauigkeit berechnet. Beginnen sie mit wenigen (z.B. 100) Stellen, um den Zeit-Bedarf der Rechnung abzuschätzen.
Mit diesem Link wird der Perl-Quelltext des Programms in einem eigenen Browser-Tab angezeigt.

Dieses Programm ist als Hilfsprogramm für einen Webserver (CGI-Programm) konzipiert. Man braucht daher Zugang zu einem Webserver (der Perl unterstützt), um das Programm als Webseite anzuzeigen.

Pi in der Programmiersprache PHP



Das Mathematik-Modul ist fast immer in der Grundausstattung von PHP installiert und daher ohne weitere Maßnahmen verfügbar. Es bietet u.a. diese Konstanten:
M_PI = π = 3.1415926535898
M_PI_2 = π/2 = 1.5707963267949
M_PI_4 = π/4 = 0.78539816339745
M_1_PI = 1/π = 0.31830988618379
M_2_PI = 2/π = 0.63661977236758
M_SQRTPI = sqrt(π) = 1.7724538509055
M_2_SQRTPI = 2/sqrt(π) = 1.1283791670955
M_LNPI = ln(π) = 1.1447298858494
Alternativ kann man Pi als Funktion verwenden:
pi() = 3.1415926535898



Mit diesem Link wird eine mit PHP programmierte Mini-Webseite geöffnet, welche Pi mit 'beliebiger' Genauigkeit berechnet. Beginnen sie mit wenigen (z.B. 100) Stellen, um den Zeit-Bedarf der Rechnung abzuschätzen.
Mit diesem Link wird der PHP-Quelltext des Programms in einem eigenen Browser-Tab angezeigt.

Der größte Teil des ↗ HTML-Quelltextes wird von statischen (gleichbleibenden) HTML-Elementen eingenommen, mit denen die Webseite mit den Bedienungs-Elementen (User-Interface) programmiert werden. Nur das Berechnungs-Programm wird mit PHP programmiert. Das PHP-Programm wird bei Anforderung am Server-PC ausgeführt, danach wird der aus HTML + PHP-Ausgabe-Text zusammengesetzte HTML-Quelltext an den Client (z.B. an ihren Browser) gesendet.


function bc_pi_viete($n) {
bcscale(floor(1.0382*$nmax+4));
$nmax = floor(1.688*$nmax+5.5);
$doloop = 1;
$z = '0';
$p = '1';
$n = 0;
while ($doloop) {
$z = bcsqrt(bcadd('2',$z));
$p = bcdiv(bcmul($p, $z), '2');
$n++;
if($n>=$nmax) {$doloop=0;}
}
$p = bcdiv(2,$p);
return $p;
}

Anwendung in einem PHP-Programm, z.B. zur Berechnung von Pi auf 100 Stellen Genauigkeit:
$pi = bc_pi_viete(100);
print $pi;