1. Chyby vstupních dat metody převedení úlohy na numerickou (řád použité metody) zaokrouhlovací reprezentace čísel v počítači 2. Reprezentace čísel v Pascalu celá čísla Typ Rozsah Formát shortint 128..127 8 bitů se znaménkem integer 32768..32767 16 bitů se znaménkem longint 2147483648.. 2147483647 32 bitů se znaménkem byte 0..255 8 bitů bez znaménka word 0..65535 16 bitů bez znaménka comp 9.2 10 18..9.2 10 18 64 bitů se znaménkem celá čísla jsou v daném rozsahu reprezentována přesně rovněž operace s celými čísly jsou přesné pokud nedojde k překročení rozsahu čísla s plovoucí desetinnou čárkou Typ Rozsah Cifer Bytů Standard single 1.5 10 45..3.4 10 38 7 8 4 IEEE real 2.9 10 39..1.7 10 38 11 12 6 Borland double 5.0 10 324..1.7 10 308 15 16 8 IEEE extended 3.4 10 4932..1.1 10 4932 19 20 10 IEEE čísla s plovoucí desetinnou čárkou jsou reprezentována ve formátu znaménko (1 bit) + exponent (8,8,11,15 bitů) + (1 bit u extended) + mantisa (23,39,52,63 bitů) např. Single podle normy IEEE 754 1 8 23 šířka v bitech s e f msb lsb msb lsb msb (most significant bit) lsb (least significant bit) pokud e=255 a f!=0, pak je číslo NaN pokud e=255 a f =0, pak je číslo ( 1) s INFINITY pokud 0<e<255, pak je číslo ( 1) s 2 (e 127) (1.f) v normalizovaném tvaru pokud e=0 a f!=0, pak je číslo ( 1) s 2 126 (0.f) v nenormalizovaném tvaru pokud e=0 a f=0, pak je číslo ( 1) s 0 Čísla v nenormalizovaném tvaru použita u IEEE pro větší přesnost Typ Nejmenší číslo > 0 V nenormalizovaném tvaru Single 1.2 10 38 1.4 10 45 Real 2.9 10 39 není Double 2.3 10 308 5.0 10 324 Extended 3.4 10 4932 1.9 10 4951 Číslo větší než maximální možné pro daný typ vyjímka Číslo menší než minimální možné pro daný typ vyjímka Overflow Underflow Příklady v Pascalu (MINREAL.PAS) MAXREAL.PAS PRES SD.PAS PRES R.PAS
3. Šíření chyb ve výpočtech týká se operací s čísly s plovoucí desetinnou čárkou násobení, dělení určí se znaménko, sečtou (nebo odečtou) se exponenty, vynásobí nebo vydělí se mantisy relativní chyba je malá, v podstatě nezávislá na násobených (dělených) číslech sčítání, odčítání čísla se nejprve musí převést na společný exponent pokud se od sebe liší v několika řádech, vzniká mnohem větší relativní chyba (největší je při odčítání téměř stejných čísel) Nejtypičtějším příkladem, kdy je vyniklá chyba závažná je výpočet kořenů kvadratické rovnice, pokud platí ac b 2 Příklady v Pascalu DEMPKVAD.PAS Napřklad pro rovnici (x 0.0001)(x 10000.0) = 0, kde jsou koeficienty a=1, b= 10000.0001, c=1 vyjde relativní chyba u menšího kořene 1.0 kořen vyjde nulový a přitom má vyjít 10 4 4. Nestabilita v některých algoritmech dochází k akumulaci zaokrouhlovací chyby to vede postupně k takové ztrátě přesnosti, že výsledek je nesmyslný u stabilních metod roste zaokrouhlovací chyba s počtem kroků nejvýš lineárně Příklady nestabilních algoritmů v Pascalu NESTAB1.PAS SPLINPR.PAS NESTOD2.PAS Zlatý řez Výpočet mocnin 'zlatého řezu' jeden z kořenů rovnice x 2 +x 1=0 5 1 = 0.618033989 2 Pro mocniny platí rekurentní vztah n+1 = n 1 n, avšak při počítání pomocí tohoto vztahu na počítači dochází k velké akumulaci chyb a výsledek je někdy dokonce záporný a pro vysoké mocniny dokonce v absolutní hodnotě větší než 1. Pokud počítáme pro n+1=20 postupně dosazujeme do rekurentního vztahu, dojdeme až k vyjádření 20 = 4181 0 6765 1, jelikož ale již v 1. kroku není vyjádření přesné, ale jeho přesnost je omezena použitým číselným typem, můžeme přepsat vztah jako 20 = 4181 0 6765( 1 + ). Počáteční nepřesnost je pro typ single 10 8, a vychází tedy 20 = 4181 6765*0.618033989 6765*10 8 = 6.4415*10 5 6.765*10 5 = 3.235*10 6.
Nestabilní metoda pro ODE Je zadána ODE y'= y s počáteční podmnkou y(0)=1. Analytické řešení této rovnice je y(x)=y(0)exp( x). Pokud použijeme pro numerické řešení dvoukrokovou metodu 2. řádu přesnosti, bude algoritmus nestabilní. V této metodě se nahradí derivace v bodě x+h y'(x+h) (y(x+2h) y(x))/2h = y(x+h). Poduk se použije například metoda Eulerova, která je velmi jednoduchá a pouze 1. řádu přesnosti, je algoritmus sice nepřesný, ale stabilní a numerická chyba nenarůstá tak rychle. Eulerova metoda je y(x+h)=y(x)+h*y'(x)=y(x) h*y(x). Na začátku je přitom 1. metoda přesnější, ale její chyba postupně narůstá a výsledek brzy přestá dávat smysl.
Nestabilní SPLINE Spline se používá k interpolaci dat, přičemž se jedná o interpolaci lokální, nejčastěji kvadratickým polynomem a v interpolečních uzlech jsou spojité derivace. Podmínky na tento polynom se zadávají v krajních bodech. Pokud se obě zadají v bodě jednom, může být algoritmus nestabilní. Například pokud místo dvou 1. derivací v krajních bodech zadáme v jednom bodě derivaci 1. i 2. Matematicky se přitom jedná o ekvivalentní úlohu.