Olen tutkimuksissani ja kokeiluissani päätynyt siihen, että jos halutaan n kpl piin desimaaleja oikein, niin laskut on suoritettava tarkkuudella 2*n ja John Machin sarjasta on otettava 2*n termiä. Ainakin tämä päti tuhanteen saakka. Pienemmilläkin arvoilla pärjännee, mutta laskin nyt näillä. En osaa sanoa päteekö sääntö suurempiinkin arvoihin.
Alla ohjelma, jolla laskin tuhat piin desimaalia ja suoritin tutkimuksen. Ajo kesti 64.667 sekuntia.
Koodi: Valitse kaikki
program TuhatPii;
uses bigdecimalmath, sysutils,DateUtils;
const tarkkuus = 1000;
tarkkuuskerroin = 2;
type strindeksi = 1..tarkkuus;
var pii, piiapuri1, piiapuri2,viisi,numero239,nelja,yksi,ind,kaksi,jakaja: BigDecimal;
str: array [1..tarkkuus] of char;
merkki,lkm,i : strindeksi;
aika1,aika2:Double;
kokeile : char;
pisin : word;
function potenssi(a,n: BigDecimal):BigDecimal; // laskee a potenssii n:n
var tulos,i: BigDecimal;
begin
tulos:=1;
i:=1;
while i<=n do begin
tulos:=tulos*a;
i:=i+1;
end;
potenssi:=tulos;
end;
begin
aika1:=Now;
pii:= 0;
ind:= 1;
piiapuri1:=0;
piiapuri2:=0;
viisi:=5;
numero239:=239;
nelja:=4;
yksi:=1;
kaksi:=2;
while ind <= (tarkkuus*2) do
begin
jakaja:=ind*(potenssi(viisi,ind));
piiapuri1:= piiapuri1+(divide(nelja, jakaja,tarkkuuskerroin*tarkkuus));
jakaja:=(ind*(potenssi(numero239,ind)));
piiapuri2:= piiapuri2-(divide(yksi, jakaja,tarkkuuskerroin*tarkkuus));
ind:=ind+kaksi;
jakaja:=(ind*(potenssi(viisi,ind)));
piiapuri1:=piiapuri1-(divide(nelja, jakaja,tarkkuuskerroin*tarkkuus));
jakaja:=(ind*(potenssi(numero239,ind)));
piiapuri2:=piiapuri2+(divide(yksi, jakaja,tarkkuuskerroin*tarkkuus));
pii:=nelja*(piiapuri1+piiapuri2);
ind:=ind+kaksi;
end;
aika2:=Now;
Writeln((aika2-aika1)*86400,' sekuntia.');
str:=BigDecimalToStr(pii);
writeln(str);
pisin:=1;
merkki:=1;
while merkki<tarkkuus do
begin
lkm:=0;
kokeile:=str[merkki];
while (kokeile=str[merkki]) and (merkki <= tarkkuus) do
begin
lkm:=lkm+1;
merkki:=merkki+1;
end;
if lkm>=pisin then
begin
pisin:=lkm;
writeln(merkki-lkm,'-',merkki-1);
for i:=(merkki-lkm) to (merkki-1) do write(str[i]);
writeln();
end;
end;
end.
Yritin laskea ensin kymmenentuhatta desimaalia, mutta kärsivällisyys loppui kesken. Tein kuvaajan: piin desimaalien laskemisen aikavaatimuksille 1:stä viiteensataan tarkkuudella tuolla minun ohjelmallani ja se nousee kyllä jyrkästi, mutta silti en ymmärä miksei edes tuntikausien ajo riittänyt kymmenelletuhannelle desimaalille, kun tuhat laskettiin minuutissa. Ymmärtääkö joku toinen? Täytyy ehkä yrittää vielä laittaa pariksi vuorokaudeksi ohjelma pyörimään. Netistä löytyisi kyllä vaikka miljoona piin desimaalia: https://www.piday.org/million/ , mutta haluaisin laskea ne itse.