Pi mit Perl und C auf beliebig viele Stellen berechnen
Wohl kaum jemanden mit etwas mathematischem Interesse lässt die faszinierende Zahl Pi kalt. Ich hab mich auch oft gefragt, wie denn auf Computern diese ganzen Millionen Stellen berechnet werden und dachte, dass irgendwelche speziellen Mathe-Bibliotheken eingesetzt würden. Nach etwas Stöbern bin ich aber hier auf eine recht simple Lösung gestoßen; der dortige Pi-berechnen-Algorithmus nach Perl transferiert ergibt diesen Code:
#!/usr/bin/perl -w use strict; use integer; # Anzahl der Stellen my $num_digits = shift; # Anzahl der zu berechnenden Terme. 14 Terme ergeben 4 Dezimalstellen, da 2**14 > 10**4 my $terms = ($num_digits / 4) * 14; print "calculating $terms terms\n"; # Ergebnisstring my $res = ''; my ($a, $b, $c, $d, $e, $g, @f) = (10000, 0, $terms, 0, 0, 0, (0)x($terms+1)); for (;$b-$c;) { $f[$b++]=$a/5; } for (; $d=0, $g=$c*2; $c-=14, $res .= sprintf("%.4d",$e+$d/$a), $e=$d%$a) { for($b=$c; $d+=$f[$b]*$a,$f[$b]=$d%--$g,$d/=$g--,--$b; $d*=$b) { } } print "$res\n";
Und so sieht ein Aufruf aus, um die ersten 50 Stellen zu berechnen:
Stefans-Macbook-Air:Pi sf$ perl pi.pl 50 calculating 168 terms 314159265358979323846264338327950288419716939937
Die Berechnung der ersten 10.000 Stellen benötigt auf meinem kleinen Macbook etwa 37 Sekunden. Das C-Programm hinter obigem Link braucht hingegen nur 2,6 Sekunden, ist also etwa 14-mal schneller. Number-Crunching wird wohl nie die Domäne von Perl werden.
Weiterer Lesestoff dazu findet sich u.a. hier:
http://crd.lbl.gov/~dhbailey/
http://www.cs.uwaterloo.ca/~alopez-o/math-faq/mathtext/node12.html
Save This Page