ČÍSLO PI

PROBLÉM
Určit číslo Pi s přesností na tisíce platných desítkových číslic.

ALGORITMUS
... autorů J. M. Borweina a P. B. Borweina začíná s počátečním nastavením

X=SQRT(2); Pi=2+X; Y=SQRT(X)

a pokračuje rekurentními vztahy

X = 0.5 * (SQRT(X) + 1 / SQRT(X)
Pi = Pi * (X + 1) / (Y + 1)
Y = Y * (SQRT(X) + 1 / SQRT(X)) / (Y + 1)

IMPLEMENTACE
Jednotka: vnitřní funkce nebo vnější, ale pak bez procedure příkazu
 
Vazba: funkce SQRT
 
Parametr: přirozené číslo P - počet platných číslic konstanty Pi, implicitně P=9
 
Vrací: prvních P platných desítkových číslic Pi
 


PI: procedure
parse arg P
if P = "" then P = 9; numeric digits P
X = SQRT(2, P); Pi = 2 + X
Y = SQRT(X, P); X = Y
do forever
  X = 0.5 * (X + 1 / X)
  NewPi = Pi * (X + 1) / (Y + 1)
  if Pi = NewPi then return Pi
  Pi = NewPi
  X = SQRT(X, P)
  Y = (Y * X + 1 / X) / (Y + 1)
end

 

Hodnotu čísla Pi stačí vypočítat jen jednou s dostatečnou přesností. Uložíme-li ji do souboru na disku, pak lze vytvořit funkci, která "vypočte" číslo Pi s požadovanou přesností mnohem rychleji než funkce PI. Příkladem je následující funkce PICONST, kterou lze "vypočítat" prvních P platných číslic čísla Pi, pro P=1,...,200. Byla vytvořena automaticky programem popsaným v Technika: Předem vypočtené konstanty.
 


PICONST: procedure; V = ''
V = V || 3.14159265358979323846264338327950288419
V = V || 7169399375105820974944592307816406286208
V = V || 9986280348253421170679821480865132823066
V = V || 4709384460955058223172535940812848111745
V = V || 028410270193852110555964462294895493038196
return V

 

Příkaz Number_Pi=PI(1000) provede 10-krát hlavní cyklus ve funkci PI a trvá 79 sekund.

SOUVISLOSTI
Druhá odmocnina kladného čísla
Technika: Předem vypočtené konstanty
P+n trik Waltera Pachla v Reflexio

Literatura
Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Numerical Recipes in C : the art of scientific computing
- 2nd ed. University Press, Cambridge, 1992


Obálka Obsah Index Hlavní stránka Rexx   Mail

změněno 30. července 2001
Copyright © 2000-2001 Vladimír Zábrodský, RNDr.
 

1