Tento článek si klade za cíl sumarizovat skutečnosti kolemznámé chyby instrukce FDIV procesoru Pentium firmy Intel. Všechny skutečnosti popisované v tomto článku jsou založeny na mých osobních zkušenostech a na zdrojích pocházejících z celosvětových počítačových sítí.
Jak se chyba projevuje?
V některých řídkých případech dělení dvou čísel s pohyblivou čárkou vrací procesor Pentium výsledek, který je méně přesný, než je to obvyklé pro jiná čísla a než je specifikováno v původní firemní dokumentaci procesoru. Tento rozdíl přesnosti je pro jisté dvojice čísel značný a pro citlivé aplikace může být fatální. Chybou jsou zatěžovány výpočty v jednoduché (single) a zdvojené (double) přesnosti.Pozitivní je, že se později již neobjevili žádné další skutečnosti nasvědčující tomu, že by tato chyba ovlivňovala i jiné instrukce procesoru.
Chyba se projevuje jen pro určitá čísla (případně pro úzké intervaly okolo nich) a opakuje se, tj. projeví se vždy při pokusu o vydělení daného páru čísel. Nezávisí ani na rychlosti běhu procesoru a na instrukcích prováděných před instrukcí dělení.
Jak se dá chyba zjistit?
Nejjednodušší metodou, jak zjistit, zda je daný procesor chybou postižen, je provést v C, Pascalu, Fortranu, ale i třeba v kalkulátoru pro Windowsnásledující dělení:
5505001/294911
správný výsledek: 18,66665197
Pentium: 18,66600093
4195835/3145727
správný výsledek: 1,33382045
Pentium: 1,33373907
Pokud dostáváte v kalkulátoru pro Windows nebo Excelu správný výsledek, není váš počítač postižen chybou. Předesílám už na tomto místě, že pokud je mi známo,všechny procesory Pentium jsou touto dětskou nemocí postiženy.
Co znamená jednoduchá a zdvojená přesnost, mantisa a exponent?
Pentium - podobně jako velká většina dalších procesorů - používá k zápisu čísla s pohyblivou čárkou standard IEEE 754. Reálné číslo je pak reprezentováno dvojicí čísel XX a Y a znaménkem. Takto zapsané číslo je rovno znaménko*1.XX*2Y, tj. jedna plus 0.XX, to celé krát 2 na Y. Část Y nazýváme exponentem a XX mantisou.
Standard definuje jednoduchou přesnost jako 23 bitů mantisy, tj asi 7 decimálních míst a dvojitou přesnost jako 52 bitů mantisy, tj. asi 15 decimálních míst. Decimálním místem zde rozumíme desetinné místo bez ohledu na to, zda se toto místo nachází před desetinnou čárkou (tečkou) nebo za ní.p>Pro kolik dvojic čísel se chyba projevuje?
Pokud se omezíme na čísla v jednoduché přesnosti, pak procesor poskytuje výsledek v menší přesnosti než jednoduché pro nejméně 1738 dvojic čísel. Z těchto 1738 dvojic pak 87 dává výsledek jen s přesností na 14 bitů, tj. asi na 4 decimální místa.
Vzhledem k podstatě chyby lze každou dvojici čísel dělit nebo násobit libovolnou mocninou dvojky a stále bude chybou zatížena. Je tomu tak proto, že chybu způsobuje jistá sekvence bitů mantisy a exponent na ni nemá vliv. Všechna čísla se stejnou mantisou uvažujeme tedy jako jediného reprezentanta téhož případu. Pro větší pohodlnost vybíráme ze všech takových čísel nejmenší kladné celé číslo zapsané ve formátu s pohyblivou čárkou. Povšimněme si, že to bude nutně číslo liché.
Pokud budeme považovat za správný model Tima Coea o vzniku chyb nevyvrácený, je výše zmíněný počet 1738 dvojic v jednoduché přesnosti konečným číslem a žádná další už nebudou nalezena.
Ve dvojité přesnosti počet dvojic čísel, pro jejichž podíl dává procesor Pentium přesnost nižší než dvojitou, rapidně narůstá. Okolo každého čísla můžeme navíc sestrojit úzký interval, v němž budou všechna čísla chybou rovněž zatížena. Je to dáno tím, že se při malé diferenci budou čísla lišit jen v dolních bitech mantisy, a ty chybovost neovlivňují. Tento drastický nárůst počtu dvojic postižených chybou není však pro většinu uživatelů pravděpodobně tak významný, neboť k chybám dochází většinou až na sedmém decimálním místě.
Ve zbývajích částech tohoto seriálu si ještě povíme, jak velká chyba může při výpočtu vzniknout a jak často se tato chyba projevuje. Další díl na našich stránkách naleznete zítra - tzn. ve čtvrtek.