Možnosti využití JavaScriptu při výuce programování a matematiky
Výpočty s 'nepřesnými' čísly
 Tisk

Výpočty s "nepřesnými" čísly

Při výpočtech s reálnými čísly je dále nutné si stále uvědomovat způsob jejich reprezentace v počítači. Jinak hrozí, že teoreticky správné algoritmy budou při jejich naprogramování dávat vlivem zaokrouhlovacích chyb nesprávné výsledky. Později se žáci seznámí s některými algoritmy numerické matematiky, u kterých bude nutná analýza zaokrouhlovacích chyb a vysvětleny metody jejich eliminace. Přesto je nutné žákům hned na počátku ukázat několik problémů, se kterými by se mohli setkat. Z důvodu omezeného paměťového místa pro uložení reálných čísel, je možné zobrazit v omezeném intervalu jen konečný počet různých hodnot (z matematického hlediska je počet všech reálných čísel nekonečný). Omezen je počet platných cifer a přípustný rozsah řádů cifer reálného čísla. Reálná čísla jsou tedy v programu nahrazena racionálními čísly z jistého intervalu a s pevně daným počtem platných cifer. S čísly, která nepatří do uvedeného intervalu nelze vůbec pracovat. Z matematického hlediska tedy můžeme přesně zobrazit v počítači jen čísla z jisté konečné - i když značně rozsáhlé - podmnožiny racionálních čísel, označme ji M. Ostatní reálná čísla x (tj. x M) jsou při uložení do paměti zaokrouhlena a nahrazena vždy nejbližším číslem x0 ∈ M. K ozřejmení problémů, proč některé výpočty počítače dávají „chybné“ výsledky, poslouží následující série příkladů.


Příklad ilustruje situaci, kdy při přičtení velmi malého čísla k číslu 1 se hodnota tohoto velmi malého čísla v součtu vůbec neprojeví.

Po provedení příkazu výstupu se vytiskne:

X = 1

Y = 7e-17

V = 1

Příčinu, proč se hodnota Y v součtu vůbec neprojeví, lze spatřovat v příliš velkém rozdílu mezi exponenty čísel X a Y. Při zobrazování výsledku V v počítači vzniká potřeba „rozšířit mantisu“, ale protože to více není možné, bity „vpravo mimo rozsah mantisy“ se zanedbají.


Další příklad je obdobou předchozího. Hodnota proměnné X je v tomto příkladu 1016 a přičtení jedničky se v součtu vůbec neprojeví. Příklad zároveň ilustruje, že by se při programování neměl provádět test na rovnost čísel v oboru reálných hodnot.


Při experimentování s předchozími příklady mohou žáci dospět k chybné představě, že problém zaokrouhlovacích chyb vyplývá z velikosti zobrazovaného čísla. Často si myslí, že počítač nedovede rozlišit pouze čísla, jejichž absolutní hodnota rozdílu je velmi malá. Následující příklad ilustruje, že problém zaokrouhlovacích chyb ve skutečnosti plyne z omezeného počtu platných cifer zobrazovaného čísla.

Po spuštění programu se v obou případech na výstupu vypíše 1e+21. Hodnoty proměnných X, Y se zobrazí stejným způsobem i když hodnota proměnné X bude např. 1.00000000000000001000E+21.


Příklad ilustruje situaci, kdy při počítání s reálnými čísly nemusí vždy platit asociativní zákon.

V prvním případě se vytiskne: V = 1

Ve druhém případě se vytiskne: V = 0


Ukázkou zobrazení racionálního čísla 1/3 v počítači může být příklad

Při prvním příkazu výstupu se zobrazí hodnota proměnné X: 0.33333333333. To by mohlo znamenat, že zobrazení racionálního čísla 1/3 (vytiskne se ve tvaru desetinného čísla s teoretickou hodnotou nekonečného počtu "trojek" za desetinnou tečkou) v počítači je přesné. V následujícím cyklu for dochází nejprve k odečtení hodnoty 0.3 od původní hodnoty proměnné X a následnému vynásobení číslem 10. Zobrazený výsledek by tedy měl být stále stejný (0.33333333333). Žákům je třeba tuto operaci ještě před spuštěním programu vysvětlit, například pomocí zápisu na tabuli, tím způsobem, že vlastně v cyklu odečítáme první trojku za desetinnou tečkou a po vynásobení číslem 10 posouváme všechny další trojky o jedno místo doleva. Protože desetinný rozvoj je v našem případě teoreticky nekonečný, mělo by se stále zobrazovat stejné číslo. Skutečnost je však taková, že se zobrazí následující hodnoty (po sloupcích):


0,33333333333

0,33333333327

0,33271654276

0,33333333333

0,33333333272

0,32716542764

0,33333333333

0,33333332717

0,27165427641

0,33333333333

0,33333327165

-0,28345723590

0,33333333333

0,33333271654

-5,83457235903

0,33333333333

0,33332716543

-61,34572359029

0,33333333333

0,33327165428

-616.45723590286



Žáci mohou s programem experimentovat, neměli by však měnit výstupní formát v příkazu výstupu (zobrazení na 11 desetinných míst). Celá záhada spočívá v tom, že 1/3∉ M a po zadání hodnoty příkazu X = 1/3 se v počítači nezobrazí 1/3, ale jiné číslo x0 ∈ M, byť k jedné třetině blízké. Tímto vzniká chyba zobrazení čísla, která se při každém dalším násobení logicky také násobí, a následně zvětšuje.

Závěrem partie o použití celých a reálných čísel je nutné zdůraznit, že pokud je možné použití celých čísel (rozsah čísel od -253 do 253), je vhodné tento rozsah neopouštět. Jakýkoli i dočasný přechod k reálným hodnotám znamená především nebezpečí vzniku zaokrouhlovacích chyb. Co nejdříve je nutné seznámit žáky se skutečností, že pro operaci dělení celých čísel existuje operace „celočíselné dělení“, kdy výsledkem operace s celými čísly je opět celé číslo.