Interní reprezentace numerických hodnot: od skutečného počítačového pravěku po IEEE 754–2008

28. 9. 2017
Doba čtení: 28 minut

Sdílet

Už jsme se věnovali zmatkům, které vládnou ve způsobu interní reprezentace řetězců. Pokud se ale podíváme na metody ukládání hodnot s plovoucí čárkou, zjistíme, že existovalo několik různých standardů i pseudostandardů.

Obsah

1. Interní reprezentace numerických hodnot: od skutečného počítačového pravěku po IEEE 754–2008

2. Reprezentace hodnot v plovoucí řádové čárce na různých typech počítačů a systémů

3. Používané varianty báze, exponentu a mantisy

4. Elektronkové a tranzistorové sálové počítače IBM

5. Rozdělení sálových počítačů IBM podle způsobu jejich použití

6. IBM 704 – sálový počítač určený pro vědeckotechnické výpočty

7. Počítače série IBM 1400

8. Formát dat zpracovávaných počítači IBM 1400

9. Sovětský elektronkový počítač Strela a jím používaný formát numerických hodnot

10. Slavná architektura IBM/360 a její matematický procesor

11. Superpočítače Cray

12. Příchod osmibitových mikropočítačů

13. Formát FP hodnot v Applesoft BASICu a na ZX Spectru

14. Atari BASIC a jeho neortodoxní reprezentace reálných čísel

15. Vlastnosti formátu použitého v osmibitových Atari

16. Datový typ real v Turbo Pascalu

17. Odkazy na Internetu

1. Interní reprezentace numerických hodnot: od skutečného počítačového pravěku po IEEE 754–2008

Reálná čísla (resp. přesněji řečeno samozřejmě podmnožina z této nespočetné množiny) začala být používána už u prvních mechanických a elektromechanických počítačů, což není příliš překvapivé, protože tyto stroje zpočátku skutečně sloužily především pro výpočty; teprve později byly navrženy stroje pro zpracování dat. První moderní (sic) použití reálných čísel nalezneme především u počítače Z1 navrženého v letech 1935 až 1936 Konradem Zusem. Tento počítač používal pro reprezentaci reálných čísel slova o šířce 22 bitů. Později vyvinutý stroj Z4 již využíval slova o šířce 32 bitů.

Obrázek 1: Konrad Zuse u makety svého mechanicko-elektronického počítače Z1.

Další vývoj systémů pro ukládání numerických hodnot byl prováděn především ve společnosti IBM (dalo by se říci, že paralelně s vývojem Fortranu), přičemž právě zde došlo k první unifikaci interní reprezentace reálných čísel s využitím slov rozdělených na tři části, které postupně reprezentují znaménko, mantisu a exponent. Tento systém, který si popíšeme v následující kapitole, se ukázal byl nadčasový, protože je používán dodnes. Ovšem konkrétní způsoby uložení mantisy a exponentu, stejně jako volba takzvané báze, se na různých typech počítačů a nebo operačních systémů, od sebe odlišují, takže se liší i rozsah reprezentovatelných hodnot, přesnost, existence či neexistence speciálních hodnot (+∞, -∞) atd.

sssr02

Obrázek 2: Hlavní moduly počítače MESM (SSSR) včetně jeho řídicího (operátorského) panelu.

2. Reprezentace hodnot v plovoucí řádové čárce na různých typech počítačů a systémů

Všechny dále popsané formáty (reprezentace) čísel používají systém takzvané plovoucí řádové čárky (anglicky floating point, protože se v angličtině namísto čárky používá tečka). Systém plovoucí řádové čárky je založen na tom, že vybraná podmnožina reálných čísel může být vyjádřena vztahem:

XFP = (-1)s × bexp-bias × m

přičemž význam jednotlivých symbolů ve vztahu je následující:

  • XFP značí reprezentovanou numerickou hodnotu z podmnožiny racionálních čísel (ta je zase podmnožinou čísel reálných). Díky vyhrazeným (speciálním) hodnotám je většinou možné rozlišit kladnou a zápornou nulu i kladné a záporné nekonečno, což je jeden z důležitých rozdílů oproti způsobu reprezentace celých čísel. Také se většinou může uložit nečíselná hodnota: NaN – (Not a Number), která je výsledkem některých matematicky nedefinovaných operací, například 0/0 nebo 00.
  • b je báze, někdy také nazývaná radix, u normy IEEE 754 je to vždy dvojka, protože výpočty s bází dvě jsou pro číslicové obvody nejjednodušší. V minulosti se však používaly i jiné báze, například 8, 16 nebo i 10, s nimi se však již dnes prakticky nesetkáme (o to relevantnější jsou však v dnešním článku).
  • exp je vždy kladná hodnota exponentu posunutého o hodnotu bias
  • bias je hodnota, díky které je uložený exponent vždy kladný. Tato hodnota se většinou volí dle vztahu:
    bias=2eb-1-1, kde eb je počet bitů vyhrazených pro exponent. Pro specifické účely je však možné zvolit i jinou hodnotu.
  • m je mantisa, která je u formátů dle normy IEEE 754 vždy kladná
  • s je znaménkový bit nabývající hodnoty 0 nebo 1. Pokud je tento bit nulový, je reprezentovaná hodnota XFP kladná, v opačném případě se jedná o zápornou hodnotu. Vzhledem k tomu, že je jeden bit vyhrazen na uložení znaménka, je možné rozlišit kladnou a zápornou nulu (některé systémy bit znaménka používají v negované podobě).
ibm05

Obrázek 3: Sálový počítač IBM-702 z roku 1953. Jednalo se o jeden z prvních počítačů specializovaných na hromadné zpracování dat, který byl vystavěn s využitím technologie elektronek a katodových (Williamsových) trubic.

3. Používané varianty báze, exponentu a mantisy

Do následující tabulky jsem se pokusil napsat všechny důležité formáty reprezentace exponentu a mantisy současně s uvedením báze. Ta je většinou dvojková, ovšem výjimkou je IBM 360 se šestnáctkovou bází a FP rutiny u osmibitových Atari s desítkovou bází:

Počítač/norma/systém Šířka (b) Báze Exponent (b) Mantisa (b)
IEEE 754 half 16 2 5 10+1
         
IEEE 754 single 32 2 8 23+1
IEEE 754 double 64 2 11 52+1
         
IEEE 754 double extended 80 2 15 64
IEEE 754 quadruple 128 2 15 112+1
IEEE 754 octuple 256 2 19 236+1
         
IBM řady 7×x 36 2 8 27
IBM 360 single 32 16 7 24
IBM 360 double 64 16 7 56
HP 3000 single 32 2 9 22
HP 3000 double 64 2 9 54
CDC 6000, 6600 60 2 11 48+1
Cray-1 64 2 15 48
         
Strela 43 2 7 35
         
Apple II 40 2 8 31+1
ZX Spectrum 40 2 8 31+1
Atari (FP rutiny) 48 10 7 40
Turbo Pascal real 48 2 8 39

Poznámka: pokud je ve sloupci Mantisa napsána hodnota n+1, znamená to, že hodnoty jsou normalizovány tak, aby první bit mantisy byl vždy jedničkový. V takovém případě tento bit nemusíme nikam zapisovat (víme, že je jednička) a tudíž se mantisa automaticky o tento jeden bit rozšiřuje. To samozřejmě neplatí pro denormalizované hodnoty (blízké nule).

Poznámka2: to, že u normy IEEE 754 se pro exponent používá 8(11) bitů a pro mantisu 23(52) bitů nemusí být ve všech případech ideální řešení, protože někdy vyžadujeme spíše menší rozsah hodnot, ale větší přesnost či naopak.

ibm06

Obrázek 4: Ovládací panel sálového počítače IBM-702.

4. Elektronkové a tranzistorové sálové počítače IBM

První generace sálových počítačů firmy IBM byla označována tříciferným kódem začínajícím na 7. Celkem se vyrábělo pět typů počítačů této generace – IBM 701, IBM 702, IBM 704, IBM 705 a IBM 709. Číselné označení těchto počítačů respektuje i posloupnost jejich vzniku (rok vzniku počítače), což u dalších řad již není vždy splněno. Procesor těchto počítačů byl sestaven z elektronek a pasivních elektronických součástek. Operační paměť se u modelů 701 a 702 skládala z katodových trubic a u dalších třech modelů pak z magnetické paměti vytvořené ze sítě feritových jader navlečených na adresové a čtecí/zápisové vodiče. Dva modely těchto počítačů byly určeny pro hromadné zpracování dat (tomu byla uzpůsobena především instrukční sada), další dva modely byly optimalizovány spíše pro vědeckotechnické výpočty – viz tabulka zobrazená pod tímto odstavcem.

Model Určení Rok výroby
701 první elektronický počítač firmy IBM 1952
702 hromadné zpracování dat 1953
704 vědeckotechnické výpočty 1954
705 hromadné zpracování dat 1954
709 vědeckotechnické výpočty 1958
ibm01

Obrázek 5: Elektronky byly v prvních sálových počítačích firmy IBM použity pro konstrukci kombinačních i sekvenčních logických obvodů.

Druhá generace sálových počítačů firmy IBM, jejíž modely jsou označovány čtyřciferným kódem začínajícím opět na sedmičku, se od první generace odlišovala především v použití odlišné technologie elektronických součástek – namísto rozměrných a poruchových elektronek s velkou spotřebou elektrické energie se zde objevují tranzistory. Rozdělení počítačů podle způsobu jejich použití (vědeckotechnické výpočty, hromadné zpracování dat, účetní operace v dekadické soustavě) však zůstává zachováno. Některé modely z druhé generace nejsou v podstatě ničím jiným, než počítači první generace s upravenou součástkovou základnou a několika dalšími vylepšeními (příkladem může být model IBM 705, který byl nahrazen modernějším modelem IBM 7080). V následující tabulce jsou vypsány nejvýznamnější modely druhé generace sálových počítačů firmy IBM (vynechány jsou pouze některé méně často prodávané varianty těchto počítačů):

Model Určení Rok výroby
7090 vědeckotechnické výpočty 1959
7094 vědeckotechnické výpočty 1962
7094 II vědeckotechnické výpočty 1964
7040 vědeckotechnické výpočty 1963
7044 vědeckotechnické výpočty 1963
7080 hromadné zpracování dat 1961
7010 rozšířená verze IBM 1410 1962
7070 dekadická soustava 1960
7072 dekadická soustava 1962
7074 dekadická soustava 1961
ibm08

Obrázek 6: Sálový počítač IBM-705.

5. Rozdělení sálových počítačů IBM podle způsobu jejich použití

Nehledě na technologii elektronických součástek používaných při implementaci logických obvodů (elektronky × tranzistory) byly první dvě generace sálových počítačů firmy IBM vyráběny v několika různých řadách, které se od sebe odlišovaly především tím, pro jaký typ úloh byly tyto počítače určeny. Jedná se o odlišný přístup, než na jaký jsme zvyklí dnes, protože v současnosti se setkáváme s prakticky zcela univerzálními počítači (i když výjimky se také najdou, jedná se například o specializované mikrořadiče, zařízení se signálovými procesory atd.). Nicméně na přelomu padesátých a šedesátých let minulého století byli inženýři firmy IBM (a nejenom oni) přesvědčeni o tom, že struktura procesoru (aritmeticko-logické jednotky, řadiče a registrů) a tím pádem i jeho instrukční sada musí být optimalizována s ohledem na to, k jakému účelu je daný model počítače používán, zda pro numerické vědeckotechnické výpočty (tyto počítače byly například používány v misích NASA), účetní operace či pro hromadné zpracování dat.

Instrukční sady sálových počítačů byly navíc poměrně složité (dnes bychom řekli, že se jednalo o architekturu CISC), což sice pomáhalo programátorům při psaní aplikací v assembleru, ale s nástupem překladačů vyšších programovacích jazyků se ukázalo, že mnohé strojové instrukce tyto překladače vůbec nepoužívají a že zjednodušení instrukční sady procesorů může vést k urychlení zpracování instrukcí (například se vynechá nutnost mikroprogramování či dokonce nanoprogramování, zjednoduší se dekodér instrukcí atd.), což je idea, která a mnoho let později vedla ke vzniku procesorů RISC, tj. procesorů se zjednodušenou instrukční sadou. Nicméně v dobách sálových počítačů 7×x a 7×xx se firmy, které si tyto počítače pořizovaly, musely podle plánovaného nasazení těchto strojů rozhodnout, který typ si zakoupí – bližší informace jsou uvedeny v navazujících kapitolách.

6. IBM 704 – sálový počítač určený pro vědeckotechnické výpočty

Typickým představitelem sálových počítačů navržených pro provádění vědeckotechnických výpočtů je model IBM 704. Jedná se o počítač založený na dnes již překonaných technologiích – elektronkách (procesor, tj. jak aritmeticko-logická jednotka, tak i řadič) a feritových pamětech s dobou přístupu 12 mikrosekund. Tento počítač zpracovával numerické hodnoty uložené ve slovech, jejichž šířka byla rovna 36 bitům, přičemž akumulátor (registr používaný jako zdroj i cíl aritmetických operací) byl rozšířen o další dva bity na celkovou šířku 38 bitů. Aritmeticko-logická jednotka tohoto počítače dokázala zpracovávat tři typy hodnot:

  1. Celá čísla či čísla s pevnou řádovou čárkou. Absolutní hodnota čísla byla uložena v 35 bitech, bit s nejvyšší váhou nesl znaménko uložené či zpracovávané hodnoty (to je zajímavé, bylo tak možné reprezentovat i zápornou nulu, kód byl symetrický).
  2. Čísla s pohyblivou řádovou čárkou, u kterých byl jeden bit rezervován pro uložení znaménka, osm bitů pro uložení exponentu (posunutého o hodnotu 128) a zbylých 27 bitů bylo použito pro uložení mantisy (v akumulátoru bylo díky dalším dvou bitům možné mantisu uložit v 29 bitech). Formát čísel s pohyblivou řádovou čárkou použitý u tohoto počítače do značné míry připomíná formát „single“ specifikovaný v normě IEEE 754, ovšem s tím rozdílem, že pro mantisu je zde použit větší počet bitů (základem exponentu je v obou případech hodnota 2).
  3. Alfanumerické znaky uložené po šesticích do slova s délkou 36 bitů. Každý alfanumerický znak je v tomto případě představován šesti bity, tj. rozeznávalo se pouze 64 různých znaků.

Bitově vypadá rozdělení 36bitového slova s FP hodnotou:

bit 35 34 … 27 26 … 0
význam s exponent (8 bitů) mantisa (27 bitů)
ibm07

Obrázek 7: Sálový počítač IBM-704.

7. Počítače série IBM 1400

Firma IBM na začátku šedesátých let minulého století nabízela i počítače, jejichž procesory zpracovávaly řetězce a číselné údaje proměnné délky (reprezentovaná různým způsobem, například v kódu 1 z 10 u děrných štítků a v BCD v případě uložení údajů do operační paměti), což je poměrně podstatný rozdíl oproti moderním mikroprocesorům, které zpracovávají numerické údaje zakódované binárně do slov pevné délky (například 16, 32 či 64 bitů) a zpracování řetězců buď není podporováno vůbec (RISC procesory) nebo pouze několika strojovými instrukcemi (architektura i386). Jedná se o počítače série 1400, které byly i přes výkonnostní rozdíly vzájemně kompatibilní (týká se to jak kompatibility aplikací, tak i kompatibility periferních zařízení):

Označení modelu Rok vzniku
IBM 1240 1963
IBM 1401 1959
IBM 1410 1960
IBM 1420 1962
IBM 1440 1962
IBM 1450 1968
IBM 1460 1963
IBM 7010 1962
ibm2

Obrázek 8: Část sálového počítače IBM 1401.

Snaha o dosažení co nejvyšší míry kompatibility s počítači série IBM 1400 šla dokonce tak daleko, že některé mainframy řady IBM System/360, například model 30, bylo možné nakonfigurovat tak, aby dokázaly spouštět aplikace vytvořené pro řadu 1400. Vzhledem k tomu, že procesory počítačů IBM System/360 většinou obsahovaly mikrokód, bylo přepnutí do režimu kompatibility s počítači 1400 poměrně snadné a zůstal přitom zachován relativně vysoký výpočetní výkon. Emulace řady 1400 byla použita i u dalších mainframů firmy IBM, takže aplikace napsané pro IBM 1400 mnohdy beze změny fungovaly i několik desítek let (do některých musel být zásah proveden až kvůli „syndromu“ Y2K, což znamená, že mnohé tyto programy mohly beze změny pracovat i po dobu delší než 35 let!)).

ibm2

Obrázek 9: Zrekonstruovaný řídicí panel počítače IBM 1401.

8. Formát dat zpracovávaných počítači IBM 1400

V předchozí kapitole jsme si řekli, že počítače série IBM 1400 zpracovávaly řetězce a číselné hodnoty proměnné délky. Jednotlivé číslice byly ukládány v kódu BCD (binary-coded decimal), tj. ve čtyřech bitech označovaných symboly 8, 4, 2 a 1 (tyto symboly samozřejmě odpovídají váze každého bitu). K těmto čtyřem bitům se přidávaly bity označované symboly A a B, jejichž nastavením bylo možné rozšířit repertoár zpracovávaných dat i o znaky a řídicí kódy (u samotných číslic byly bity A i B vždy nulové). K takto vzniklé šestici bitů se navíc automaticky přidával bit C nesoucí informaci o paritě (lichá parita použitá k detekci jednoduché chyby) a bit M, jehož hodnota udávala, zda se jedná o poslední číslici numerické hodnoty či poslední znak řetězce. Výsledný formát bajtů zpracovávaných počítačem IBM 1400 je následující:

C B A 8 4 2 1 M

Celou tabulku hodnot jednotlivých bitů i přiřazení těchto kombinací číslicím a znakům je dostupný na adrese http://en.wikipedia.org/wi­ki/IBM_1401#Character_and_Op_co­des. Povšimněte se, že příznak ukončení numerické hodnoty či řetězce (bit M) je součástí každého bajtu, což je poměrně velký rozdíl oproti formátu řetězců používaných například v céčku (ukončení znakem NUL, tj. nulovým bajtem; podporováno některými mikroprocesory) nebo řetězcům, kterým předchází bajt/slovo s uloženu délkou (některé Basicy, klasický Forth, Pascal atd., taktéž podporováno některými mikroprocesory, viz například prefixový kód REP u architektury i386).

ibm2

Obrázek 10: Jedno velmi často používané periferní zařízení – řádková tiskárna IBM 1403. Mimochodem: právě tuto tiskárnu můžete vidět ve slavném filmu Dr. Divnoláska (Dr. Strangelove).

9. Sovětský elektronkový počítač Strela a jím používaný formát numerických hodnot

Jedním z prvních poměrně úspěšných počítačů navržených a vyráběných v SSSR byly počítače Strela-1, které byly vytvořeny vývojovým týmem vedeným Y. Bazilevským. Jednalo se o první počítač, který byl v SSSR vyráběn sériově (v průběhu let 1953 až 1956), i když celkový počet vyrobených a následně plně zprovozněných počítačů dosahoval pouze několika jednotek, s velkou pravděpodobností 7 až 10 kusů. Dostupné údaje o počtu vyrobených kusů se od sebe liší, pravděpodobně i z toho důvodu, že některé instalace počítačů Strela neobsahovaly všechny moduly, takže například počet vyrobených procesorových jednotek se odlišuje od počtu bubnových pamětí atd. Po technologické stránce se tyto počítače příliš neodlišovaly od jejich západních kolegů – procesorová jednotka i řadič byly vytvořeny z elektronek a polovodičových diod, využívaly se bubnové paměti, Williamsovy (katodové) trubice, magnetické pásky, děrné štítky atd.

sssr03

Obrázek 11: Pohled na počítač Strela, z jehož rozměrů je zřejmé, proč se těmto strojům říkalo „sálové počítače“.

Počítače Strela byly určeny především pro numerické výpočty (simulace, vědeckotechnické aplikace, další vývoj výpočetní techniky), čemuž odpovídá i formát údajů, které bylo možné v procesorové jednotce těchto počítačů zpracovávat – jednalo se o číselné hodnoty reprezentované ve formátu plovoucí řádové čárky, které byly uložené ve slovech i poněkud neobvyklé šířce 43 bitů. Pokud vám připadá podivné, že tyto počítače nezpracovávaly slova o šířce, jež je celočíselným násobkem osmi (8 bitů, 16 bitů, 32 bitů, 64 bitů), vzpomeňte si na IBM 704 (1954, tj. současník počítače Strela, dokonce i určení tohoto počítače bylo podobné), jež zpracovávaly operandy o šířce 36 bitů. Bitová šířka zpracovávaných operandů na hodnoty obvyklé dnes se ustálila až o cca 10 let později.

Procesorová jednotka elektronkového počítače Strela pracovala s operandy majícími šířku 43 bitů. Číselné hodnoty mohly být uloženy ve dvou formátech – binárním formátu s pohyblivou řádovou čárkou (FP – floating point) a BCD formátu, taktéž s pohyblivou řádovou čárkou. Největší rozdíl mezi těmito dvěma formáty spočíval v tom, jakým způsobem byly zakódovány číslice mantisy. Buď se jednalo o binární kód: v tomto případě byla mantisa uložena na 35 bitech, což odpovídá 10 až 11 platným desítkovým číslicím. Nebo bylo možné pro uložení mantisy použít kód BCD, což znamenalo, že každá číslice mantisy byla uložena ve čtveřici bitů. Délka mantisy byla v tomto případě rovna 36 bitům, což odpovídá 36/4=9 číslicím. To je sice méně než při použití binárního formátu, ale operace pro vstupy nebo výstupy numerických hodnot se díky použití BCD kódu zjednodušily (ostatně právě z tohoto důvodu se BCD používal i na mnoha kalkulačkách, včetně legendární HP-35). Funkce jednotlivých bitů 43bitových slov zpracovávaných procesorem počítače Strela jsou uvedeny v následující dvojici tabulek:

Binární formát uložení mantisy:

Bity (pozice) Význam
0 znaménko mantisy
1–35 absolutní hodnota mantisy
36 znaménko exponentu
37–42 hodnota exponentu
Přesnost 10–11 desítkových číslic
Rozsah 1.8×10-19 až 1.8×1019

BCD formát uložení mantisy:

Bity (pozice) Význam
0 znaménko mantisy
1–36 mantisa uložená v BCD tvaru – 4 bity na číslici
37 znaménko exponentu
38–42 hodnota exponentu
Přesnost 9 desítkových číslic
Rozsah 1.8×10-19 až 1.8×1019

10. Slavná architektura IBM/360 a její matematický procesor

V roce 1964 firma IBM oznámila vznik nové série počítačů pojmenované System/360. Číslo „360“ v názvu této série naznačovalo, že se jedná o universální počítače, což znamenalo určitý odklon firmy IBM od návrhu počítačů specializovaných na určitý typ úloh (viz výše popisované počítače specializované buď na hromadné zpracování dat nebo na provádění vědeckotechnických výpočtů). Celá série System/360 původně zahrnovala šest vzájemně kompatibilních modelů, které se však od sebe odlišovaly jak cenou, tak i výpočetním výkonem (mezi nejvýkonnějším a nejméně výkonným modelem dosahoval poměr výpočetní rychlosti hodnoty téměř 25:1).

ibm2

Obrázek 12 Jeden z prvních modelů počítače série System/360.

Procesory počítačů System/360 zpracovávaly poměrně složité instrukce, protože se jednalo o klasickou architekturu CISC (v té době se věřilo, že komplexní instrukční sada pomůže programátorům překonat sémantickou propast mezi strojovým kódem popř. assemblerem a vyššími programovacími jazyky). Aby i jednodušší modely série System/360 mohly zpracovávat všechny instrukce, používaly jejich procesory mikrokód, pomocí něhož se složitější instrukce rozdělily na sérii jednodušších mikroinstrukcí (ty měly zcela jiný formát, protože se jimi přímo ovládaly jednotlivé bloky v procesoru – ALU, registry, interní sběrnice atd.). Jednalo se o 32bitovou architekturu se šestnácti 32bitovými registry označovanými jmény R0R15 a čtyřmi 64bitovými registry určenými pro práci s hodnotami uloženými ve formátu pohyblivé řádové čárky. Kromě pracovních registrů procesor obsahoval i PSW (processor status word), v němž byl uložen i čítač instrukcí PC, příznak práce v superuživatelském režimu atd.

ibm2

Obrázek 13: Úvodní stránka manuálu k assembleru počítačů System/360.

Výkonný model označovaný IBM System/360 Model 91 byl vybaven i matematickým procesorem se čtyřmi pracovními registry, z nichž každý měl šířku 64 bitů. Pro reprezentaci čísel v pohyblivé řádové čárce se používal formát navržený samotnou firmou IBM s jednoduchou (single) či dvojitou (double) přesností, o kterém se v tomto článku zmiňuji i z toho důvodu, že se dodnes používá například v několika souborových formátech. I když moderní matematické koprocesory na platformě i386 využívají formát numerických hodnot definovaný v IEEE 754, který je v několika ohledech od formátu firmy IBM odlišný (rozdílné šířky mantisy a exponentu, jiná hodnota biasu), je původní „360“ formát zachován například v mainframech IBM System z10, spolu s formátem IEEE 754.

Největším rozdílem IBM System/360 oproti jiným počítačům při práci s FP hodnotami je použitá báze, která není rovna dvěma ale šestnácti. To znamená, že změna exponentu o jedničku znamená změnu uložené hodnoty na šestnáctinásobek či naopak na 1/16. Díky tomu se mohlo pro exponent obětovat pouze sedm bitů, a to při zachování dostatečného rozsahu. Taktéž se lišil algoritmu normalizace hodnot, který vyžadovat, že nejvyšší 4 bity mantisy budou nenulové. To v některých případech snižovalo přesnost (u single na pouhých 21 bitů namísto 24). Zpočátku také nebylo nijak definováno, jak se mají reprezentovat speciální hodnoty typu +∞, -∞ a 0/0 (či jiné NaN).

Rozsah normalizovaných hodnot je 16-65 až zhruba 1663.

ibm3_

Obrázek 14: Částečně zrekonstruovaný ovládací panel počítače IBM System/360 Model 91.

11. Superpočítače Cray

V tomto článku samozřejmě nesmíme zapomenout na superpočítače Cray, které jsou známé především díky špičkovému výpočetnímu výkonu a také astronomickými sumami, za které je bylo možné pořídit :-). Tyto stroje byly optimalizovány pro provádění výpočtů se skalárními hodnotami, vektory i maticemi, což znamená, že se jejich architektura poměrně značně odlišovala od například již zmíněných strojů Connection Machine, které spíše excelovaly při (symbolickém) zpracovávání strukturovaných údajů – seznamů, stromů, grafů atd. Díky tomu, že jedním z cílů počítačů Cray byl co největší výpočetní výkon, umisťovaly se tyto stroje mezi TOP10 nejvýkonnějších počítačů světa.

Obrázek 15: Celkový pohled na superpočítač Cray-1.

Dokonce ještě v roce 2010 byl nejrychlejším (reálně existujícím) počítačem na světě Jaguar neboli Cray XT5 s výpočetním výkonem neuvěřitelných 1.75 PFLOPS (petaflops), který překonal i IBM Roadrunner. Vzhledem k tomu, že počítače Cray zpracovávaly a zpracovávají neuvěřitelné množství numerických dat, může být popis jejich interního formátu FP hodnot užitečný.

Obrázek 16: Cray-1 a jeho duchovní otec a konstruktér.

Počítače Cray-1 používaly pro skalární i vektorové operace numerické hodnoty uložené v systému plovoucí řádové čárky (FP). Tyto hodnoty byly sice uložené v 64 bitech, podobně jako je tomu u formátu double v normě IEEE 754, ovšem význam jednotlivých bitů je poněkud jiný, takže se liší jak rozsah uchovávaných hodnot, tak i počet platných míst, což je patrné z následující tabulky:

  Min Max Počet míst
IEEE single 1.17E-0038 3.40E+0038 7
IEEE double 2.22E-0308 1.79E+0308 16
Cray single 3.67E-2466 2.73E+2465 15

Obrázek 17: Detail spodní části superpočítače CRAY-1S. Na pravé straně fotografie je patrný „vstup“ do vnitřního prostoru stroje.

Obsazení bitů v 64bitovém slovu (registru) je u počítačů Cray-1 následující:

 1 1      14                              48
+-+-+--------------+------------------------------------------------+
|s|t|      e       |                       m                        |
+-+-+--------------+------------------------------------------------+

kde:

  • s: znaménko mantisy
  • t: znaménko exponentu
  • e: exponent
  • m: mantisa

12. Příchod osmibitových mikropočítačů

O významu osmibitových domácích i osobních mikropočítačů jsme se již zmiňovali minule, a to v kontextu s programovacími jazyky. Osmibitové mikropočítače měly společnou minimálně jednu vlastnost – neobsahovaly žádný matematický koprocesor, takže se veškeré výpočty musely zdlouhavě provádět na osmibitovém CPU (přičemž jen některé CPU obsahovaly násobičku). Na druhou stranu to tvůrcům programového vybavené umožnilo volbu rozličných formátů reprezentace čísel. V dalších kapitolách se seznámíme s formátem používaným Applesoft BASICem na počítačích Apple II, dále s prakticky totožným formátem využívaným na ZX Spectru a nezapomeneme ani na Atari BASIC se zajímavým formátem založeným na desítkové a nikoli dvojkové bázi.

Obrázek 18: Výkonu Crayů v FP operacích osmibitové mikropočítače samozřejmě ani zdaleka nedosahovaly. Tento výpočet Mandelbrotovy množiny v Atari BASICu trval přibližně osm hodin.

13. Formát FP hodnot v Applesoft BASICu a na ZX Spectru

„Before .Net, before math coprocessors, before IEEE-574, Microsoft defined a bit pattern for floating-point numbers.“

Applesoft BASIC na osobních osmibitových mikropočítačích Apple používal formát FP hodnot, který je známý pod jménem MBF neboli Microsoft Binary Format. Tento formát byl navržen Monte Davidoffem pro Altair Basic a později byl portován i do Applesoft Basicu. Ve skutečnosti existoval Microsoft Binary Format ve více variantách, především v 32bitové a 40bitové variantě. Applesoft BASIC využíval právě 40bitovou variantu, v níž je mantisa uložena ve čtyřech bajtech (32 bitech), pro znaménko je vyhrazen další bit a zbývajících sedm bitů je použito pro exponent s biasem (offsetem) nastaveným na 128. Báze je samozřejmě rovna dvěma:

       8        1                        31
+--------------+-+------------------------------------------------+
|      e       |s|                       m                        |
+--------------+-+------------------------------------------------+

Obrázek 19: Primitivní prográmek pro zjištění, zda dojde k překročení maximální reprezentovatelné hodnoty.

I na ZX Spectru se používal podobný formát numerických hodnot uložených v pěti bajtech (40 bitech), ovšem na těchto počítačích se mantisa normalizovala takovým způsobem, aby její nejvyšší bit byl jedničkový. Nejmenší reprezentovatelná hodnota odlišná od nuly byla přibližně ±4×10-39, nejvyšší hodnota pak cca 1038, což pro většinu výpočtů zcela dostačovalo. Při výpočtech se kontrolovalo překročení maximální hodnoty, což mj. znamená, že neexistovaly speciální hodnoty typu +∞ atd.

Obrázek 20: Interpret BASICu korektně zjistil, že výpočet přesáhl maximální hodnotu.

Podobně jako u dále popsaného typu real v Turbo Pascalu leží vlastnosti FP hodnot ZX Spectra mezi možnostmi typů single a double podle IEEE 754.

Obrázek 21: Výsledek pokusu o dělení nulou (viz výpis programu).

14. Atari BASIC a jeho neortodoxní reprezentace reálných čísel

V Atari BASICu, přesněji řečeno v subrutinách uložených v ROM, které se staraly o výpočty nad reálnými čísly, se používal formát odlišný od prakticky všech předchozích formátů. Stále se sice jedná o hodnoty s plovoucí řádovou čárkou, ovšem báze není rovna dvěma (většina strojů) ani šestnácti (IBM/360), ale stu! Navíc není mantisa uložená binárně, ale používá se BCD, což konkrétně znamená, že v pěti bajtech je uloženo přesně deset číslic (procesor 6502 dokázal s BCD pracovat nativně). To není úplně špatné řešení, protože ho najdeme například na mnoha kalkulačkách. Zjednodušují se převody řetězců na čísla a naopak, na druhou stranu jsou však veškeré výpočty značně pomalejší a přesnost ani rozsah hodnot není tak vysoký, jako při použití binárního kódu.

Formát uložení FP hodnot tedy vypadá následovně:

Bajt 0 1 2 3 4 5
Význam znaménko+exponent 2 BCD číslice 2 BCD číslice 2 BCD číslice 2 BCD číslice 2 BCD číslice

Povšimněte si faktu, že pro uložení exponentu muselo stačit pouze sedm bitů, což je pro formát používající šest bajtů pro jednu hodnotu, na první pohled poměrně málo, ovšem musíme si uvědomit, že báze je rovna 100 a nikoli 2.

Obrázek 22: Po vytvoření nové proměnné (s reálnou hodnotou) se v paměti alokuje celkem devět bajtů, přičemž šest bajtů zabere vlastní hodnota (viz předchozí tabulku), dva bajty typ a jméno proměnné a jeden bajt její index.

Uložená hodnota se vypočte takto: mantisa×100exponent-64

Pokud je exponent sudý, lze přesně reprezentovat deset číslic (cifer), u lichého exponentu jen devět číslic (cifer). Je to logické, protože změna exponentu o jedničku znamená posun čárky o dvě cifry.

Obrázek 23: V mnoha moderních jazycích dojde při výpočtech k „tichému“ přetečení z nejvyšší hodnoty do nekonečna. V Atari BASICu není možné ∞ reprezentovat a proto je namísto toho hlášena chyba.

15. Vlastnosti formátu použitého v osmibitových Atari

Jaké má toto řešení výhody? Především lze přesně reprezentovat často používané hodnoty 0,1, 0,01 atd. Ostatně podívejme se na to, jak se chová interpret jazyka Lua (používá typ double), interpret Pythonu (taktéž double) a interpret Atari BASICu:

Lua:

> print(0.2 + 0.2 == 0.4)
true
 
> print(0.1 + 0.2 == 0.3)
false
 
> print(1 + 2 == 3)
true

Python:

>>> 0.2 + 0.2 == 0.4
True
 
>>> 0.1 + 0.2 == 0.3
False
 
>>> 1 + 2 == 3
True

Atari BASIC:

PRINT 0.2 + 0.2 = 0.4
1
 
PRINT 0.1 + 0.2 = 0.3
1
 
PRINT 1 + 2 = 3
1
 

Poznámka: v Atari BASICu odpovídá hodnota 1 pravdivostní hodnotě True.

Dále – nebylo možné reprezentovat žádné speciální hodnoty, takže dělení nulou či výpočet 0/0 skončil s chybou:

Obrázek 24: Speciální hodnoty není možné reprezentovat.

Pro zajímavost jsou v následující tabulce vypsány adresy těch paměťových buněk, které se používají FP subsystémem operačního systému osmibitových mikropočítačů Atari. Prvních šest oblastí paměti je uloženo v RAM, další oblasti pak v paměti ROM (jedná se o subrutiny):

Jméno Adresa Délka (bajtů) Význam
FR0 0×00D4 6 první FP operand
FR1 0×00E0 6 druhý FP operand
CIX 0×00F2 1 index do INBUFF
INBUFF 0×00F3 2 ukazatel na buffer používaný při převodu z řetězce na FP
FLPTR 0×00FC 2 ukazatel na uživatelský buffer
LBUFF 0×0580 ? buffer používaný při převodu na řetězec
AFP 0×D800 ? subrutina pro převod řetězce na FP
FASC 0×D8E6 ? subrutina pro převod FP na řetězec
IFP 0×D9AA ? subrutina pro převod integer na FP
FPI 0×D9D2 ? subrutina pro převod FP na integer
ZFR0 0×DA44 ? subrutina pro vymazání FR0
ZF1 0×DA46 ? subrutina pro vymazání bufferu FP
FSUB 0×DA60 ? subrutina pro výpočet FR0 – FR1
FADD 0×DA66 ? subrutina pro výpočet FR0 + FR1
FMUL 0×DADB ? subrutina pro výpočet FR0 * FR1
FDIV 0×DB28 ? subrutina pro výpočet FR0 / FR1
FLD0R 0×DD89 ? subrutina pro načtení FR0 s použitím X,Y jako ukazatelů
FLD0P 0×DD8D ? subrutina pro načtení FR0 přes ukazatel FLPTR
FLD1R 0×DD98 ? subrutina pro načtení FR1 s použitím X,Y jako ukazatelů
FLD1P 0×DD9C ? subrutina pro načtení FR1 přes ukazatel FLPTR
FST0R 0×DDA7 ? subrutina pro uložení FR0 na adresu v X,Y
FST1P 0×DDAB ? subrutina pro uložení FR0 na adresu v FLPTR
FMOVE 0×DDB6 ? subrutina pro převod FR0 do FR1
EXP 0×DDC0 ? subrutina pro výpočet en
EXP10 0×DDCC ? subrutina pro výpočet 10n
PLYEVL 0×DD40 ? subrutina pro další výpočty pomocí řady
LOG 0×DECD ? subrutina pro výpočet ln FR0
LOG10 0×DED1 ? subrutina pro výpočet log FR0

16. Datový typ real v Turbo Pascalu

Standard programovacího jazyka Pascal uvádí několik základních datových typů, mezi jinými i real. Ovšem není nijak specifikováno, s jakou přesností a rozsahem mají být hodnoty používající tento formát uloženy. V populárním Turbo Pascalu se používal datový typ real, který je někdy známý i pod označením real48, protože pro reprezentaci FP hodnoty skutečně využíval 48 bitů. Tento typ byl navržen ještě předtím, než se na IBM PC rozšířily matematické koprocesory, což mj. znamenalo, že se hodnoty typu real zpracovávaly softwarově. Rozsah a přesnost leží přibližně na polovině cesty mezi typem single/float a double z normy IEEE 754.

Obrázek 25: Nabídka datových typů pro FP hodnoty nabízená Turbo Pascalem 7.

Formát real48 je celkem jednoduchý – jeden bajt je rezervován pro uložení exponentu posunutého o 129, dalších pět bajtů pak pro uložení mantisy. Pouze v posledním bajtu (nejvyšším – jedná se o little endian) je jeden bit rezervován pro uložení znaménka:

Bajt 0 1 2 3 4 5
Význam exponent mantisa mantisa mantisa mantisa znaménko+mantisa

Obrázek 26: Testovací prográmek pro zjištění, jak se testuje překročení maximální hodnoty.

Obrázek 27: Pro typ real testování funguje.

Obrázek 28: Pro typ real testování funguje.

Později byly do Turbo Pascalu přidány i typy single, double a extended, které mohly být zpracovány buď matematickým koprocesorem nebo jeho emulátorem. Dnešní varianty Pascalu, tj. FreePascal a Lazarus, již původní real48 nepoužívají a mapují namísto toho real buď na single (SW emulace) či na double (HW koprocesor).

bitcoin_skoleni

Obrázek 29: Testovací prográmek přepsaný pro použití typu single (podle IEEE 754).

Obrázek 30: Hmm, nekonečná smyčka.

17. Odkazy na Internetu

  1. Norma IEEE 754 a příbuzní: formáty plovoucí řádové tečky
    https://www.root.cz/clanky/norma-ieee-754-a-pribuzni-formaty-plovouci-radove-tecky/
  2. IEEE-754 Floating-Point Conversion
    http://babbage.cs.qc.cuny.edu/IEEE-754.old/32bit.html
  3. Small Float Formats
    https://www.khronos.org/o­pengl/wiki/Small_Float_For­mats
  4. Art of Assembly language programming: The 80×87 Floating Point Coprocessors
    https://courses.engr.illi­nois.edu/ece390/books/arto­fasm/CH14/CH14–3.html
  5. Art of Assembly language programming: The FPU Instruction Set
    https://courses.engr.illi­nois.edu/ece390/books/arto­fasm/CH14/CH14–4.html
  6. INTEL 80387 PROGRAMMER'S REFERENCE MANUAL
    http://www.ragestorm.net/dow­nloads/387intel.txt
  7. Floating-Point Formats
    http://www.quadibloc.com/com­p/cp0201.htm
  8. Mainframe family tree and chronology
    http://www-03.ibm.com/ibm/history/ex­hibits/mainframe/mainframe_FT1­.html
  9. 704 Data Processing System
    http://www-03.ibm.com/ibm/history/ex­hibits/mainframe/mainframe_PP704­.html
  10. 705 Data Processing System
    http://www-03.ibm.com/ibm/history/ex­hibits/mainframe/mainframe_PP705­.html
  11. The IBM 704
    http://www.columbia.edu/a­cis/history/704.html
  12. IBM Mainframe album
    http://www-03.ibm.com/ibm/history/ex­hibits/mainframe/mainframe_al­bum.html
  13. Mainframe computer
    http://en.wikipedia.org/wi­ki/Mainframe_computer
  14. IBM mainframe
    http://en.wikipedia.org/wi­ki/IBM_mainframe
  15. IBM 700/7000 series
    http://en.wikipedia.org/wi­ki/IBM700/7000_series
  16. IBM System/360
    http://en.wikipedia.org/wi­ki/IBM_System/360
  17. IBM System/370
    http://en.wikipedia.org/wi­ki/IBM_System/370
  18. IBM Floating Point Architecture
    http://en.wikipedia.org/wi­ki/IBM_Floating_Point_Archi­tecture
  19. Extended Binary Coded Decimal Interchange Code
    http://en.wikipedia.org/wiki/EBCDIC
  20. ASCII/EBCDIC Conversion Table
    http://docs.hp.com/en/32212–90008/apcs01.html
  21. EBCDIC
    http://www.hansenb.pdx.edu/DMKB/dic­t/tutorials/ebcdic.php
  22. EBCDIC tables
    http://home.mnet-online.de/wzwz.de/temp/eb­cdic/cc_en.htm
  23. The Mainframe Blog
    http://mainframe.typepad.com/blog/2006/11/my_per­sonal_mai.html
  24. IBM Tightens Stranglehold Over Mainframe Market Gets Hit with Antitrust Complaint in Europe
    http://www.ccianet.org/ar­tmanager/publish/news/IBM_Tig­htens_Stranglehold_Over_Ma­inframe_Market_Gets_Hit_wit­h_Antitrust_Complaint_in_E­urope.shtml
  25. Lectures in the History of Computing: Mainframes
    http://www.computinghisto­rymuseum.org/teaching/lec­tures/pptlectures/9-MainframeComputers.ppt
  26. 36-bit
    http://en.wikipedia.org/wiki/36-bit_word_length
  27. 36bit.org
    http://www.36bit.org/
  28. Applesoft BASIC
    https://en.wikipedia.org/wi­ki/Applesoft_BASIC
  29. How did the Apple II do floating point?
    https://groups.google.com/fo­rum/#!topic/comp.emulator­s.apple2/qSBiG2TAlRg
  30. IBM Floating Point Architecture
    https://en.wikipedia.org/wi­ki/IBM_Floating_Point_Archi­tecture
  31. The Arithmetic Subroutines
    http://www.users.waitrose­.com/~thunor/mmcoyzx81/chap­ter17.html
  32. ZX Floating point to Decimal code in BASIC
    http://www.sinclairzxworld­.com/viewtopic.php?t=1422
  33. Floating Point Arithmetic Package
    http://www.retrocomputing­.net/parts/atari/800/docs/a­tari_os/atari_os_user_manu­al08.htm
  34. 704 Data Processing System
    https://www-03.ibm.com/ibm/history/ex­hibits/mainframe/mainframe_PP704­.html
  35. Turbo Pascal Real
    http://www.shikadi.net/mod­dingwiki/Turbo_Pascal_Real
  36. THE FLOATING POINT ARITHMETIC PACKAGE
    http://www.atarimax.com/fre­enet/freenet_material/5.8-BitComputersSupportArea/7­.TechnicalResourceCenter/sho­warticle.php?14
  37. Sinclair ZX81 BASIC Programming (by Steven Vickers)
    http://www.worldofspectrum­.org/ZX81BasicProgramming/
  38. The Most Expensive One-byte Mistake: Did Ken, Dennis, and Brian choose wrong with NUL-terminated text strings?
    http://queue.acm.org/deta­il.cfm?id=2010365
  39. UCSD Pascal
    https://en.wikipedia.org/wi­ki/UCSD_Pascal
  40. D Language: Strings
    https://dlang.org/spec/arra­ys.html#strings
  41. The History Behind the Definition of a ‚String‘
    https://stackoverflow.com/qu­estions/880195/the-history-behind-the-definition-of-a-string
  42. Libc: Representation of Strings
    https://www.gnu.org/softwa­re/libc/manual/html_node/Re­presentation-of-Strings.html
  43. ATARI BASIC
    http://www.atariarchives.or­g/dere/chapt10.php
  44. BASIC (Wikipedia EN)
    http://en.wikipedia.org/wiki/BASIC
  45. BASIC (Wikipedia CZ)
    http://cs.wikipedia.org/wiki/BASIC
  46. Turbo BASIC (Wikipedia CZ)
    http://cs.wikipedia.org/wi­ki/Turbo_BASIC
  47. Sinclair BASIC (Wikipedia CZ)
    http://cs.wikipedia.org/wi­ki/Sinclair_BASIC
  48. More BASIC Computer Games
    http://www.atariarchives.or­g/morebasicgames/
  49. Dartmouth College Computation Center: 1964 – The original Dartmouth BASIC manual
    http://www.bitsavers.org/pdf/dar­tmouth/BASIC_Oct64.pdf
  50. The Original BASIC
    http://www.truebasic.com/
  51. BASIC – Beginners All-purpose Symbolic Instruction Code
    http://hopl.murdoch.edu.au­/showlanguage.prx?exp=176
  52. Universal Coded Character Set
    https://en.wikipedia.org/wi­ki/Universal_Coded_Charac­ter_Set
  53. UTF-16
    https://en.wikipedia.org/wiki/UTF-16
  54. PEP 393 – Flexible String Representation
    https://www.python.org/dev/peps/pep-0393/
  55. In-memory size of a Python structure
    https://stackoverflow.com/qu­estions/1331471/in-memory-size-of-a-python-structure
  56. What is internal representation of string in Python 3.x
    https://stackoverflow.com/qu­estions/1838170/what-is-internal-representation-of-string-in-python-3-x#9079985
  57. How to profile memory usage in Python
    https://www.pluralsight.com/blog/tu­torials/how-to-profile-memory-usage-in-python
  58. What's the rationale for null terminated strings?
    https://stackoverflow.com/qu­estions/4418708/whats-the-rationale-for-null-terminated-strings
  59. Unicode
    https://en.wikipedia.org/wiki/Unicode
  60. The Development of the C Language
    https://www.bell-labs.com/usr/dmr/www/chist.html
  61. Borland Pascal Wiki: String operations
    http://borlandpascal.wiki­a.com/wiki/String_operati­ons
  62. Pascal Strings
    https://www.tutorialspoin­t.com/pascal/pascal_strin­gs.htm
  63. PChar – Null terminated strings
    https://www.freepascal.org/docs-html/ref/refsu12.html
  64. Comparison of Pascal and C
    https://en.wikipedia.org/wi­ki/Comparison_of_Pascal_an­d_C
  65. FORTRAN 66
    http://fortranwiki.org/for­tran/show/FORTRAN+66
  66. Fortran: strings
    https://en.wikibooks.org/wi­ki/Fortran/strings
  67. Strings in Atari BASIC
    http://www.cyberroach.com/a­nalog/an11/strings.htm
  68. String Arrays in Atari BASIC
    http://www.atarimagazines­.com/compute/issue11/52_1_STRIN­G_ARRAYS_IN_ATARI_BASIC.php
  69. An Atari BASIC Tutorial
    http://www.cyberroach.com/a­nalog/an25/basictutorial.htm
  70. Basic Multilingual Plane
    https://en.wikipedia.org/wi­ki/Plane_(Unicode)#Basic_Mul­tilingual_Plane

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.