home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1997 October
/
Chip_1997-10_cd.bin
/
ctenari
/
cisloe
/
popis.txt
< prev
next >
Wrap
Text File
|
1997-09-02
|
5KB
|
101 lines
P²i matematick∞ch v∞poƒtech se obƒas vyskytne pot²eba
provést v∞poƒet s velkou p²esností na velk∞ poƒet míst, a£ jiº
desetinn∞ch nebo celkov╪ platn∞ch. Ve v╪tτin╪ p²ípadà se vystaƒí
s typy prom╪nn∞ch, které b╪ºn╪ nabízejí programovací jazyky.
N╪kdy se vτak màºe stát, ºe ani kapacita t╪chto prom╪nn∞ch
nestaƒí. Pak je t²eba bu╘ sáhnout po speciálních programov∞ch
prost²edcích, a pokud nejsou zrovna po ruce (resp. jsou p²íliτ
drahé), pokusit se vypomoci vlastními silami.
Zpàsobà jak to uƒinit je samoz²ejm╪ nep²ebern╪ mnoho
a záleºí na mnoha faktorech jak∞ postup zvolit. Namátkou màºeme
vyjmenovat: pot²ebná rychlost v∞poƒtu, poºadovaná p²esnost,
pouºit∞ programovací jazyk, programátorské schopnosti
a matematické schopnosti programátora a.t.d. Velmi ƒasto pak lze
p²i ²eτení konkrétní úlohy vyuºít i ràzn∞ch heuristik,
urychlujících ƒasto mnohonásobn╪ v∞poƒty.
Jedním z moºn∞ch zpàsobà v∞poƒtu na velk∞ poƒet míst je
simulace "ruƒního" poƒítání (násobení, d╪lení a.t.d.). Pouºití
kalkulaƒky je dnes pro v╪tτinu lidí samoz²ejmostí i p²i
nejb╪ºn╪jτích banálních v∞poƒtech. V╪²ím tomu, ºe bych ²adu lidí
vyvedl alespoσ na chvilku z míry, kdybych po nich cht╪l, aby
vyd╪lili na papí²e τestimístné ƒíslo t²ímístn∞m na ƒty²i
desetinná místa.
P²edstavme si, ºe jsme v situaci, kdy pot²ebujeme provád╪t
v∞poƒty t²eba na 1000 platn∞ch míst. V praxi je pot²eba takto
p²esn∞ch v∞poƒtà samoz²ejm╪ minimální, nicmén╪ màºe se vyskytnout
a£ jiº jako skuteƒn╪ praktická pot²eba nebo jako p²edm╪t v∞zkumu.
Ukaºme si p²íklad podobného v∞poƒtu, kde pouºijeme simulaci
"ruƒního" d╪lení a sƒítání k v∞poƒtu ƒísla "e" (Eulerova
konstanta, která je základem p²irozen∞ch logaritmà. Jedná se
o transcendentní ƒíslo, ƒili ƒíslo s nekoneƒn∞m desetinn∞m
rozvojem, jehoº p²ibliºná hodnota je 2,71828182459...). V praxi
se k jeho v∞poƒtu màºe pouºít nekoneƒná ²ada:
∩
ex = ¬ (Xk/k!)
k=0
Zdánliv╪ sloºit∞ tvar màºeme rozepsat trochu pochopiteln╪ji:
X0 X1 X2 X3 X4
ex = ─- + ── + ── + ── + ── ...
0! 1! 2! 3! 4!
Budeme-li poƒítat hodnotu e, bude mít ²ada tvar
1 1 1 1 1
e = ─- + ── + ── + ── + ── ...
0! 1! 2! 3! 4!
Pro v∞poƒet si definujeme dv╪ pole (nap². typu Byte)
o rozsahu, podle poƒtu míst, na která chceme ƒíslo e urƒit. Kaºd∞
prvek pole bude pro nás reprezentovat jednu cifru Do prvního
z nich - oznaƒme jej A - uloºíme hodnotu 1.0000... , ƒili do
prvního prvku dáme 1 a do dalτích uloºíme nuly. Toto pole bude
pro nás reprezentovat p²i v∞poƒtu aktuální hodnotu prvku ²ady. Do
druhého pole - oznaƒíme jej B - vloºíme hodnotu 2.0000... . Toto
pole pro nás bude reprezentovat souƒet spoƒten∞ch ƒlenà ²ady.
Pokud budeme poƒítat na v╪tτí poƒet míst, narazili bychom jeτt╪
na dalτí problém. Hodnoty n! rostou velmi rychle. K v∞poƒtu
nap²íklad jen na 1000 míst je pot²eba spoƒítat p²es 200 ƒlenà
²ady. Pokud bychom poƒítali skuteƒn╪ kaºd∞ ƒlen samostatn╪,
museli bychom vypoƒítávat p²ísluτn∞ faktoriál a d╪lit jím
jedniƒku.
Tento postup je vτak moºno podstatn╪ zjednoduτit. Staƒí si
uv╪domit, ºe v poli A máme uloºenou zpoƒátku hodnotu 1. Pro
v∞poƒet t²etího ƒlenu (první dva samoz²ejm╪ není t²eba poƒítat)
staƒí vyd╪lit hodnotu v tomto poli ƒíslem 2. Hodnotu tohoto pole
p²iƒteme k poli B. Pro získání hodnoty ƒtvrtého ƒlenu staƒí kdyº
hodnotu v poli A vyd╪líme ƒíslem 3. Op╪t p²iƒteme hodnotu v poli
A do pole B a pokraƒujeme d╪lením pole A ƒíslem 4 atd. Tím jsme
uτet²eni poƒítání vysok∞ch faktoriálà a problémà s d╪litelem
velk∞ch rozm╪rà. V∞poƒet màºeme skonƒit v okamºiku, kdy obsah
pole A je cel∞ nulov∞.
Vlastní d╪lení ƒísla v poli A (viz p²iloºen∞ program) vychází
z klasického schéma, které se pouºívá p²i d╪lení na papíru tak,
jak jsme se uƒili ve τkole.
Co se t∞ká chyby ve v∞sledku, dá se její hranice urƒit z poƒtu
poƒítan∞ch ƒlenà ²ady. V∞poƒet kaºdého ƒlenu ²ady je p²esn∞,
s v∞jimkou hodnoty posledního místa. Horní hranice chyby je tedy
omezena ƒíslem 9*n, kde n je poƒet poƒítan∞ch ƒlenà ²ady. Chyba
tedy màºe b∞t maximáln╪ na posledních log10(9*n)ti místech.
P²iloºen∞ program slouºí jako ilustrativní p²íklad. Jist╪
sami najdete ²adu moºností jak program vylepτit a urychlit.
Nap²íklad bajt màºe obsahovat ne jednu, ale dv╪ cifry. Pak màºe
b∞t v n-místném poli bajtà màºe b∞t uloºen dvojnásobn∞ poƒet
pozic poƒítaného ƒísla a v∞poƒet prob╪hne za stejnou dobu,
zajímavé màºe b∞t dopln╪ní tisku o pràb╪ºném stavu v∞poƒtu,
o ƒasov∞ch relacích v závislosti na poƒtu poƒítan∞ch míst,
a.t.d.).
Ji²í Ventluka