Binárně kódované desetinné číslo - Binary-coded decimal

Binární hodiny mohl použít LED vyjádřit binární hodnoty. V těchto hodinách každý sloupec LED zobrazuje binárně kódovanou desítkovou číslici tradičního sexagesimálního času.

V počítačových a elektronických systémech je binárně kódované desetinné číslo ( BCD ) třída binárních kódování desetinných čísel, kde každá číslice je reprezentována pevným počtem bitů , obvykle čtyřmi nebo osmi. Někdy se pro znaménko nebo jiné indikace (např. Chyba nebo přetečení) používají speciální bitové vzory .

V systémech orientovaných na bajty (tj. Většina moderních počítačů) termín rozbalený BCD obvykle znamená plný bajt pro každou číslici (často včetně znaménka), zatímco zabalený BCD obvykle kóduje dvě číslice v rámci jednoho bajtu využitím výhody, že čtyři bity stačí k reprezentaci rozsahu 0 až 9. Přesné 4bitové kódování se však může z technických důvodů lišit (např. Excess-3 ).

Těchto deset stavů představujících číslici BCD se někdy nazývá tetrades (pro nibble, která je obvykle potřebná k jejich držení, je také známá jako tetrade), zatímco nepoužívané, nestarající se státy se jmenují pseudo -tetrad (e) s  [ de ] , pseudo-desetinná místa nebo pseudo-desítková čísla .

Ve srovnání s binárními pozičními systémy je hlavní ctností BCD jeho přesnější reprezentace a zaokrouhlování desetinných veličin a také snadný převod na konvenční reprezentace čitelné pro člověka. Jeho hlavními nevýhodami jsou mírné zvýšení složitosti obvodů potřebných k implementaci základní aritmetiky a také o něco méně husté úložiště.

BCD byla použita v mnoha brzy desetinných počítačů , a je implementována v instrukční sadě strojů, jako jsou IBM System / 360 série a jeho potomků, Digital Equipment Corporation je VAX , v Burroughs B1700 , a Motorola 68000 -series procesorů. BCD per se není tak široce používán jako v minulosti a již není implementován do instrukčních sad novějších počítačů (např. ARM ); x86 již nepodporuje své pokyny BCD v dlouhém režimu . Desetinné formáty s pevnou desetinnou čárkou a s plovoucí desetinnou čárkou jsou však stále důležité a nadále se používají ve finančních, komerčních a průmyslových výpočtech, kde nelze tolerovat jemné převody a chyby zaokrouhlování zaokrouhlování, které jsou vlastní binárním reprezentacím s pohyblivou řádovou čárkou.

Pozadí

BCD využívá skutečnosti, že libovolné jedno desetinné číslo může být reprezentováno čtyřbitovým vzorem. Nejviditelnějším způsobem kódování číslic je Natural BCD (NBCD), kde každá desetinná číslice je reprezentována odpovídající čtyřbitovou binární hodnotou, jak ukazuje následující tabulka. Toto je také nazýváno kódováním "8421".

Desetinná číslice BCD
8 4 2 1
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1

Toto schéma může být také označováno jako Simple Binary-Coded Decimal ( SBCD ) nebo BCD 8421 a je nejběžnějším kódováním. Mezi další patří takzvané kódování „4221“ a „7421“-pojmenované podle váhy použité pro bity-a „ Přebytek-3 “. Například číslice 6 BCD 0110'bv zápisu 8421 je 1100'bv 4221 (jsou možná dvě kódování), 0110'bv 7421, zatímco v Excess-3 je 1001'b( ).

4bitové BCD kódy a pseudotetrades
Bit Hmotnost  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15         Komentář        
4 8 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 Binární
3 4 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
2 2 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
název 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Desetinný
8 4 2 1 (XS-0) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
7 4 2 1 0 1 2 3 4 5 6   7 8 9          
Aiken (2 4 2 1) 0 1 2 3 4             5 6 7 8 9
Přebytek-3 (XS-3) -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12
Přebytek-6 (XS-6) -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
Jump-at-2 (2 4 2 1) 0 1             2 3 4 5 6 7 8 9
Skok na 8 (2 4 2 1) 0 1 2 3 4 5 6 7             8 9
4 2 2 1 (I) 0 1 2 3     4 5         6 7 8 9
4 2 2 1 (II) 0 1 2 3     4 5     6 7     8 9
5 4 2 1 0 1 2 3 4       5 6 7 8 9      
5 2 2 1 0 1 2 3     4   5 6 7 8     9  
5 1 2 1 0 1 2 3       4 5 6 7 8       9
5 3 1 1 0 1   2 3 4     5 6   7 8 9    
Bílá (5 2 1 1) 0 1   2   3   4 5 6   7   8   9
5 2 1 1 0 1   2   3   4 5   6   7   8 9
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Magnetická páska   1 2 3 4 5 6 7 8 9 0          
Pavel   1 3 2 6 7 5 4   0     8 9    
Šedá 0 1 3 2 7 6 4 5 15 14 12 13 8 9 11 10
Glixon 0 1 3 2 6 7 5 4 9       8      
Ledley 0 1 3 2 7 6 4 5         8   9  
4 3 1 1 0 1   2 3     5 4     6 7   8 9
LARC 0 1   2     4 3 5 6   7     9 8
Klar 0 1   2     4 3 9 8   7     5 6
Petherick (RAE)   1 3 2   0 4     8 6 7   9 5  
O'Brien I (Watts) 0 1 3 2     4   9 8 6 7     5  
5-cyklický 0 1 3 2     4   5 6 8 7     9  
Tompkins I. 0 1 3 2     4     9     8 7 5 6
Lippel 0 1 2 3     4     9     8 7 6 5
O'Brien II   0 2 1 4   3     9 7 8 5   6  
Tompkins II     0 1 4 3   2   7 9 8 5 6    
Přebytek-3 šedá -3 -2 0 -1 4 3 1 2 12 11 9 10 5 6 8 7
6 3 −2 −1 (I)         3 2 1 0   5 4 8 9   7 6
6 3 −2 −1 (II) 0       3 2 1   6 5 4   9 8 7  
8 4 −2 −1 0       4 3 2 1 8 7 6 5       9
Lucal 0 15 14 1 12 3 2 13 8 7 6 9 4 11 10 5
Kautz I. 0     2   5 1 3   7 9   8 6   4
Kautz II   9 4   1   3 2 8   6 7   0 5  
Susskind já   0   1   4 3 2   9   8 5   6 7
Susskind II   0   1   9   8 4   3 2 5   6 7
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Následující tabulka představuje desetinná místa od 0 do 9 v různých systémech kódování BCD. V záhlaví „ “ označuje hmotnost každého bitu. V pátém sloupci („BCD 8 4 −2 −1“) jsou dvě váhy záporné. Zobrazeny jsou také znakové kódy ASCII i EBCDIC pro číslice, což jsou příklady zónových BCD. 8421

 
Číslice
BCD
8 4 2 1
Stibitzův  kód nebo přebytek-3 Aiken-Code nebo BCD
2 4 2 1
BCD
8 4 −2 −1
IBM 702 , IBM 705 , IBM 7080 , IBM 1401 8421
ASCII
0000 8421
EBCDIC
0000 8421
0 0000 0011 0000 0000 1010 0011 0000 1111 0000
1 0001 0100 0001 0111 0001 0011 0001 1111 0001
2 0010 0101 0010 0110 0010 0011 0010 1111 0010
3 0011 0110 0011 0101 0011 0011 0011 1111 0011
4 0100 0111 0100 0100 0100 0011 0100 1111 0100
5 0101 1000 1011 1011 0101 0011 0101 1111 0101
6 0110 1001 1100 1010 0110 0011 0110 1111 0110
7 0111 1010 1101 1001 0111 0011 0111 1111 0111
8 1000 1011 1110 1000 1000 0011 1000 1111 1000
9 1001 1100 1111 1111 1001 0011 1001 1111 1001

Protože většina počítačů pracuje s daty v 8bitových bajtech , je možné ke kódování čísla BCD použít jednu z následujících metod:

  • Rozbaleno : Každá desetinná číslice je zakódována do jednoho bajtu, přičemž čtyři bity představují číslo a zbývající bity nemají žádný význam.
  • Balení : Dvě desetinná místa jsou kódována do jednoho bajtu, přičemž jedna číslice je v nejméně významném nibble ( bity 0 až 3 ) a druhá číslice v nejvýznamnějším nibble (bity 4 až 7).

Například kódování desetinného čísla 91pomocí rozbaleného BCD má za následek následující binární vzorec dvou bajtů:

Decimal:         9         1
Binary : 0000 1001 0000 0001

V zabaleném BCD by se stejný počet vešel do jednoho bajtu:

Decimal:   9    1
Binary: 1001 0001

Proto je numerický rozsah pro jeden nebalený BCD byte nula až devět včetně, zatímco rozsah pro jeden zabalený BCD byte je nula až devadesát devět včetně.

K reprezentaci čísel větších než je rozsah jednoho bajtu lze použít libovolný počet souvislých bytů. Například, aby program reprezentoval desetinné číslo 12345v zabaleném BCD pomocí formátu big-endian , kódoval by se takto:

Decimal:    0    1    2    3    4    5
Binary : 0000 0001 0010 0011 0100 0101

Zde byla nejvýznamnější okusování nejvýznamnějšího bajtu zakódována jako nula, takže číslo je uloženo jako 012345(rutiny formátování však mohou nahradit nebo odstranit úvodní nuly). Packed BCD je při využití úložiště efektivnější než nebalený BCD; kódování stejného čísla (s počáteční nulou) v rozbaleném formátu by spotřebovalo dvojnásobek úložiště.

Operace řazení a maskování se používají k zabalení nebo vybalení zabalené číslice BCD. Jiné bitové operace se používají k převodu číslice na ekvivalentní bitový vzor nebo obrácení postupu.

Balené BCD

V zabaleném BCD (nebo jednoduše zabaleném desetinném čísle ) každá ze dvou kousků každého bajtu představuje desetinnou číslici. Packed BCD se používá nejméně od 60. let minulého století a od té doby je implementován do veškerého sálového hardwaru IBM. Většina implementací je big endian , tj. S významnější číslicí v horní polovině každého bajtu as bajtem úplně vlevo (sídlícím na nejnižší adrese paměti) obsahujícím nejvýznamnější číslice zabalené desítkové hodnoty. Dolní nibble bajtu zcela vpravo se obvykle používá jako příznak označení, ačkoli některým reprezentacím bez znaménka chybí příznak označení. Například 4bajtová hodnota se skládá z 8 nibbles, přičemž horních 7 nibbles ukládá číslice 7místné desítkové hodnoty a nejnižší nibble označuje znak desítkové celočíselné hodnoty.

Standardní hodnoty znaménka jsou 1100 ( hex C) pro kladné (+) a 1101 (D) pro záporné ( -). Tato konvence pochází z pole zóny pro znaky EBCDIC a reprezentace podepsaného přebití . Další povolená znaménka jsou 1010 (A) a 1110 (E) pro pozitivní a 1011 (B) pro negativní. Pokud je v PSW nastaven bit A v standardu ASCII-8, který nikdy neprošel, budou procesory IBM System/360 používat znaky 1010 (A) a 1011 (B). Většina implementací také poskytuje hodnoty BCD bez znaménka se znaménkem nibble 1111 (F). ILE RPG používá 1111 (F) pro kladné a 1101 (D) pro záporné. Ty odpovídají zóně EBCDIC pro číslice bez přebití znaménka. V zabalených BCD je číslo 127 reprezentováno 0001 0010 0111 1100 (127C) a −127 je reprezentováno 0001 0010 0111 1101 (127D). Burroughsovy systémy používaly pro záporné hodnoty 1101 (D) a jakákoli jiná hodnota je považována za kladnou hodnotu (procesory normalizují kladné znaménko na 1100 (C)).

Znaková
číslice
BCD
8 4 2 1
Podepsat Poznámky
A 1 0 1 0 +  
B 1 0 1 1 -  
C 1 1 0 0 + Preferováno
D 1 1 0 1 - Preferováno
E 1 1 1 0 +  
F 1 1 1 1 + Nepodepsaný

Bez ohledu na to, kolik slov je slovo široké , vždy existuje sudý počet kousků, protože každý bajt má dvě z nich. Slovo o n bajtech tedy může obsahovat až (2 n ) −1 desetinná místa, což je vždy lichý počet číslic. Vyžaduje desetinné číslo s d číslicemi1/2( d +1) bajtů úložného prostoru.

Například 4bajtové (32bitové) slovo může obsahovat sedm desetinných číslic plus znaménko a může představovat hodnoty v rozmezí od ± 9 999 999. Číslo −1,234,567 je tedy široké 7 číslic a je zakódováno jako:

0001 0010 0011 0100 0101 0110 0111 1101
1    2    3    4    5    6    7    −

Stejně jako znakové řetězce je první bajt zabaleného desetinného čísla - tedy ten s nejvýznamnějšími dvěma číslicemi - obvykle uložen na nejnižší adresu v paměti, nezávisle na endianness stroje.

Naproti tomu celé číslo komplementu 4bajtové binární dvojky může představovat hodnoty od −2,147,483,648 do +2,147,483,647.

Zatímco zabalený BCD nevyužívá optimálně úložiště (s použitím asi 20% více paměti než binární zápis pro ukládání stejných čísel), převod na ASCII , EBCDIC nebo různá kódování Unicode je triviální, protože nejsou vyžadovány žádné aritmetické operace. Dodatečné požadavky na úložiště jsou obvykle kompenzovány potřebou přesnosti a kompatibility s kalkulačkou nebo ručním výpočtem, kterou poskytuje desítková aritmetika s pevnou řádovou čárkou. Existují hustší obaly BCD , které se vyhýbají pokutě za ukládání a také nepotřebují žádné aritmetické operace pro běžné převody.

Balíček BCD je v programovacím jazyce COBOL podporován jako datový typ „COMPUTATIONAL-3“ (rozšíření IBM přijaté mnoha dalšími dodavateli překladačů) nebo „PACKED-DECIMAL“ (součást standardu COBOL 1985). Je podporován v PL/I jako „FIXED DECIMAL“. Vedle mainframů kompatibilních s IBM System/360 a novějšími je zabalený BCD implementován do nativní instrukční sady původních procesorů VAX od společnosti Digital Equipment Corporation a některých modelů sálových počítačů řady SDS Sigma a je nativním formátem pro střední systémy Burroughs Corporation řada sálových počítačů (pocházející z řady Electrodata 200 z 50. let ).

Reprezentace deseti doplňkových čísel pro záporná čísla nabízejí alternativní přístup ke kódování znaménka zabalených (a jiných) čísel BCD. V tomto případě mají kladná čísla vždy nejvýznamnější číslici mezi 0 a 4 (včetně), zatímco záporná čísla jsou reprezentována doplňkem 10 příslušného kladného čísla. Výsledkem je, že tento systém umožňuje, aby se 32bitová zabalená čísla BCD pohybovala v rozmezí od −50 000 000 do +49 999 9999 a −1 je vyjádřena jako 999 9 9999. (Stejně jako u dvou binárních čísel komplementu není rozsah symetrický kolem nuly.)

Desetinné místo s pevnou čárkou

Desetinná čísla s pevnou čárkou podporují některé programovací jazyky (například COBOL, PL/I a Ada ). Tyto jazyky umožňují programátorovi určit implicitní desetinnou čárku před jednou z číslic. Například zabalená desetinná hodnota zakódovaná bajty 12 34 56 7C představuje hodnotu pevného bodu +1 234 567, když se implicitní desetinná čárka nachází mezi 4. a 5. číslicí:

12 34 56 7C
12 34.56 7+

Desetinná tečka není ve skutečnosti uložena v paměti, protože zabalený formát úložiště BCD to neposkytuje. Jeho umístění je kompilátoru jednoduše známé a vygenerovaný kód se podle toho chová pro různé aritmetické operace.

Kódování s vyšší hustotou

Pokud desetinná číslice vyžaduje čtyři bity, pak tři desetinné číslice vyžadují 12 bitů. Protože je však 2 10 (1 024) větší než 10 3 (1 000), jsou -li kódována tři desetinná místa společně, je potřeba pouze 10 bitů. Dvě taková kódování jsou kódování Chen -Ho a hustě zabalené desetinné číslo (DPD). Ten má tu výhodu, že podmnožiny kódování kódují dvě číslice v optimálních sedmi bitech a jednu číslici ve čtyřech bitech, jako v běžném BCD.

Zónové desítkové

Některé implementace, například systémy sálových počítačů IBM , podporují zónové desítkové číselné reprezentace. Každá desetinná číslice je uložena v jednom bajtu, přičemž spodní čtyři bity kódují číslici ve formě BCD. Horní čtyři bity, nazývané „zónové“ bity, jsou obvykle nastaveny na pevnou hodnotu, takže bajt obsahuje hodnotu znaku odpovídající číslici. Systémy EBCDIC používají zónovou hodnotu 1111 (hex F); tím se získají bajty v rozsahu F0 až F9 (hex), což jsou kódy EBCDIC pro znaky „0“ až „9“. Podobně systémy ASCII používají hodnotu zóny 0011 (hex 3), přičemž kódy znaků jsou 30 až 39 (hex).

U desetinných hodnot se zónovou zónou obsahuje nibble zón zcela vpravo (nejméně významný) znakovou číslici, což je stejná sada hodnot, která se používá pro desetinná čísla se sbaleným znaménkem (viz výše). Zónová desetinná hodnota zakódovaná jako hexadecimální bajty F1 F2 D3 tedy představuje desetinnou hodnotu se znaménkem −123:

F1 F2 D3
1  2 −3

EBCDIC zónová desítková převodní tabulka

Číslice BCD Hexadecimální Znak EBCDIC
0+ C0 A0 E0 F0 {(*)   \ (*) 0
1+ C1 A1 E1 F1 A ~ (*)   1
2+ C2 A2 E2 F2 B s S 2
3+ C3 A3 E3 F3 C t T 3
4+ C4 A4 E4 F4 D u U 4
5+ C5 A5 E5 F5 E proti PROTI 5
6+ C6 A6 E6 F6 F w W 6
7+ C7 A7 E7 F7 G X X 7
8+ C8 A8 E8 F8 H y Y 8
9+ C9 A9 E9 F9 z Z 9
0− D0 B0     } (*) ^ (*)    
1− D1 B1     J.      
2− D2 B2     K      
3− D3 B3     L      
4− D4 B4     M      
5− D5 B5     N.      
6− D6 B6     Ó      
7− D7 B7     P      
8− D8 B8     Otázka      
9− D9 B9     R.      

(*) Poznámka: Tyto znaky se liší v závislosti na nastavení místní znakové stránky .

Desetinné místo s pevným bodem

Některé jazyky (například COBOL a PL/I) přímo podporují zónová desetinná místa s pevným bodem a přiřazují implicitní desetinnou čárku na určitém místě mezi desítkové číslice čísla. Například vzhledem k šestibajtové zónové desítkové hodnotě se znaménkem s implikovanou desetinnou čárkou napravo od čtvrté číslice představují hexadecimální bajty F1 F2 F7 F9 F5 C0 hodnotu +1 279,50:

F1 F2 F7 F9 F5 C0
1  2  7  9. 5 +0

BCD v počítačích

IBM

IBM používala výrazy Binary-Coded Decimal Interchange Code (BCDIC, někdy také nazývané BCD) pro 6bitové alfanumerické kódy, které představovaly čísla, velká písmena a speciální znaky. Některé varianty BCDIC alphamerics se používají ve většině raných počítačů IBM, včetně IBM 1620 (zavedeno v roce 1959), řady IBM 1400 a členů bez desítkové architektury řady IBM 700/7000 .

Řady IBM 1400 jsou stroje adresovatelné podle znaků, přičemž každé umístění má šest bitů označených B, A, 8, 4, 2 a 1, navíc bit pro kontrolu liché parity ( C ) a bit pro označení slovem ( M ). Pro kódování číslic 19 jsou B a A nulové a číslice je reprezentována standardními 4bitovými BCD v bitech 81 . Pro většinu ostatních znaků jsou bity B a A jednoduše odvozeny od „zónových úderů“ „12“, „11“ a „0“ „v kódu znaku děrné karty a od 8 do 1 od 1 do 9 úderů. A "12 zóna" punč nastavit jak B a A , je "11" zóna set B a "0 zóny" (A 0 děrování kombinovat s ostatními) množina . Písmeno A , které je (12,1) ve formátu děrné karty, je tedy zakódováno (B, A, 1) . Symbol měny $ , (11,8,3) v děrné kartě, byl v paměti zakódován jako (B, 8,2,1) . To umožňuje obvodům převádět mezi formátem děrné karty a formátem interního úložiště být velmi jednoduché pouze v několika zvláštních případech. Jedním důležitým zvláštním případem je číslice 0 , reprezentovaná osamělým úderem 0 na kartě, a (8,2) v základní paměti.

Paměť IBM 1620 je organizována do 6bitových adresovatelných číslic, obvyklých 8, 4, 2, 1 plus F , používaných jako příznakový bit a C , lichý paritní kontrolní bit. Alphamerics BCD jsou kódovány pomocí dvojic číslic, přičemž „zóna“ v číslici se sudou adresou a „číslice“ v číslici s lichou adresou, přičemž „zóna“ souvisí s 12 , 11 a 0 „zónovými údery“ jako v sérii 1400. Hardware pro překlad vstupu/výstupu převedený mezi interními páry číslic a externími standardními 6bitovými kódy BCD.

V desítkové architektuře jsou alphamerics IBM 7070 , IBM 7072 a IBM 7074 kódovány pomocí dvojic číslic (pomocí kódu dvou číslic z pěti v číslicích, nikoli BCD) 10místného slova, přičemž „zóna“ v levou číslici a „číslici“ na pravé číslici. Hardware pro překlad vstupu/výstupu převedený mezi interními páry číslic a externími standardními 6bitovými kódy BCD.

Se zavedením System/360 rozšířila IBM 6bitovou alfameriku BCD na 8bitovou EBCDIC, což umožnilo přidání mnoha dalších znaků (např. Malých písmen). Rovněž je implementován numerický datový typ BCD s proměnnou délkou , který poskytuje strojové instrukce, které provádějí aritmetiku přímo na zabalená desetinná data.

Na počítačích IBM 1130 a 1800 je zabalený BCD podporován softwarem Commercial Subroutine Package společnosti IBM.

Data BCD jsou dnes stále hojně využívána v procesorech a databázích IBM , jako je IBM DB2 , mainframe a Power6 . V těchto produktech je BCD obvykle zónový BCD (jako v EBCDIC nebo ASCII), zabalený BCD (dvě desetinná místa na bajt) nebo „čisté“ kódování BCD (jedna desetinná číslice uložená jako BCD v dolních čtyřech bitech každého bajtu) . Všechny tyto funkce se používají v hardwarových registrech a procesních jednotkách a v softwaru. Chcete -li převést zabalená desetinná místa v uvolněných tabulkách EBCDIC na čitelná čísla, můžete použít masku OUTREC FIELDS nástroje JFS DFSORT.

Jiné počítače

Řada VAX-11 společnosti Digital Equipment Corporation obsahuje pokyny, které mohou provádět aritmetiku přímo na zabalených datech BCD a převádět mezi zabalenými daty BCD a jinými celočíselnými reprezentacemi. Zabalený formát BCD VAX je kompatibilní s formátem IBM System/360 a pozdějšími kompatibilními procesory IBM. Implementace MicroVAX a novější VAX upustily od této schopnosti z CPU, ale zachovaly si kompatibilitu kódu s předchozími počítači implementací chybějících pokynů v softwarové knihovně dodávané s operačním systémem. Toto je vyvoláno automaticky zpracováním výjimek, když se vyskytnou zaniklé instrukce, aby se programy, které je používají, mohly provádět bez úprav na novějších počítačích.

Architektura Intel x86 podporuje jedinečný 18místný (desetbajtový) formát BCD, který lze načíst a uložit z registrů s plovoucí desetinnou čárkou, odkud lze provádět výpočty.

Řada Motorola 68000 měla pokyny BCD.

V novějších počítačích jsou tyto možnosti téměř vždy implementovány v softwaru, nikoli v sadě instrukcí CPU, ale numerická data BCD jsou stále extrémně běžná v komerčních a finančních aplikacích. Existují triky pro implementaci zabalených BCD a zónových desetinných sčítání nebo odčítání operací pomocí krátkých, ale obtížně pochopitelných sekvencí slovně paralelní logické a binární aritmetické operace. Následující kód (napsaný v jazyce C ) například vypočítá nepodepsané 8místné zabalené přidání BCD pomocí 32bitových binárních operací:

uint32_t BCDadd(uint32_t a, uint32_t b)
{
    uint32_t t1, t2;    // unsigned 32-bit intermediate values

    t1 = a + 0x06666666;
    t2 = t1 ^ b;                   // sum without carry propagation
    t1 = t1 + b;                   // provisional sum
    t2 = t1 ^ t2;                  // all the binary carry bits
    t2 = ~t2 & 0x11111110;         // just the BCD carry bits
    t2 = (t2 >> 2) | (t2 >> 3);    // correction
    return t1 - t2;                // corrected BCD sum
}

BCD v elektronice

BCD je velmi běžný v elektronických systémech, kde má být zobrazena číselná hodnota, zejména v systémech sestávajících pouze z digitální logiky a neobsahujících mikroprocesor. Použitím BCD může být manipulace s číselnými daty pro zobrazení značně zjednodušena tím, že se s každou číslicí bude zacházet jako s jedním samostatným dílčím obvodem. To mnohem více odpovídá fyzické realitě zobrazovacího hardwaru-designér by se například mohl rozhodnout použít sérii samostatných identických sedmisegmentových displejů pro vybudování měřícího obvodu. Pokud by bylo číselné množství uloženo a manipulováno jako čistě binární, propojení s takovým displejem by vyžadovalo složité obvody. Proto v případech, kdy jsou výpočty relativně jednoduché, může práce s BCD vést k celkově jednoduššímu systému, než je převod do a z binárního souboru. Většina kapesních kalkulaček provádí všechny své výpočty v BCD.

Stejný argument platí, když hardware tohoto typu používá vestavěný mikrokontrolér nebo jiný malý procesor. Interní reprezentace čísel ve formátu BCD často vede k menšímu kódu, protože převod z nebo na binární reprezentaci může být u takto omezených procesorů drahý. U těchto aplikací některé malé procesory obsahují vyhrazené aritmetické režimy, které pomáhají při psaní rutin, které manipulují s množstvím BCD.

Operace s BCD

Přidání

Je možné provést přidání nejprve přidáním do binární, přičemž potom následuje převedení do BCD poté. Konverzi jednoduchého součtu dvou číslic lze provést přidáním 6 (tj. 16-10), když pětibitový výsledek přidání dvojice číslic má hodnotu větší než 9. Důvodem pro přidání 6 je, že existují 16 možných 4bitových hodnot BCD (od 2 4 = 16), ale platných je pouze 10 hodnot (0000 až 1001). Například:

1001 + 1000 = 10001
   9 +    8 =    17

10001 je binární, nikoli desítková reprezentace požadovaného výsledku, ale nejvýznamnější 1 („carry“) se nevejde do 4bitového binárního čísla. V BCD stejně jako v desítkové soustavě nemůže existovat hodnota větší než 9 (1001) na číslici. Abychom to napravili, 6 (0110) se přičte k součtu a výsledek je potom považován za dvě okusování:

10001 + 0110 = 00010111 => 0001 0111
   17 +    6 =       23       1    7

Dvě kousky výsledku, 0001 a 0111, odpovídají číslicím „1“ a „7“. Výsledkem je „17“ v BCD, což je správný výsledek.

Tuto techniku ​​lze rozšířit na přidávání více číslic přidáním do skupin zprava doleva, šířením druhé číslice jako přenosu, vždy porovnáním 5bitového výsledku každého součtu párů číslic na 9. Některé CPU poskytují příznak polovičního přenosu k usnadnění aritmetických úprav BCD po operacích binárního sčítání a odčítání. CPU Z80 poskytuje operační kód DAA, Decimal Adjust Accumulator, DAA

Odčítání

Odečtení se provádí přidáním desetinného doplňku podtrendu k menuendu . Pro reprezentaci znaménka čísla v BCD se číslo 0000 používá k reprezentaci kladného čísla a 1001 k reprezentaci záporného čísla . Zbývajících 14 kombinací je neplatným znakem. Pro ilustraci odečtení podepsaných BCD zvažte následující problém: 357 - 432.

V podepsaném BCD je 357 0000 0011 0101 0111. Desetinový doplněk 432 lze získat tak, že vezmeme devítkový doplněk 432 a poté přidáme jeden. Takže 999 - 432 = 567 a 567 + 1 = 568. Předcházením 568 v BCD kódem záporného znaménka lze reprezentovat číslo −432. Takže −432 v podepsaném BCD je 1001 0101 0110 1000.

Nyní, když jsou obě čísla zastoupena v podepsaných BCD, je lze sčítat:

  0000 0011 0101 0111
  0    3    5    7
+ 1001 0101 0110 1000
  9    5    6    8
= 1001 1000 1011 1111
  9    8    11   15

Vzhledem k tomu, že BCD je formou desítkové reprezentace, několik výše uvedených číslic je neplatných. V případě, že existuje neplatný záznam (jakákoli číslice BCD větší než 1001), přidá se 6, aby se vygeneroval přenosový bit a způsobil, že se součet stane platným záznamem. Takže přidání 6 k neplatným záznamům má za následek následující:

  1001 1000 1011 1111
  9    8    11   15
+ 0000 0000 0110 0110
  0    0    6    6
= 1001 1001 0010 0101
  9    9    2    5

Výsledek odečtení je tedy 1001 1001 0010 0101 (−925). Pro potvrzení výsledku si všimněte, že první číslice je 9, což znamená záporné. To se zdá být správné, protože 357 - 432 by mělo mít za následek záporné číslo. Zbývající kousky jsou BCD, takže 1001 0010 0101 je 925. Doplněk desítky z 925 je 1000 - 925 = 75, takže vypočítaná odpověď je −75.

Pokud se sčítá jiný počet kousků (například 1053 - 2), musí se číslo s menším počtem číslic nejprve doplnit nulami, než se vezme doplnění nebo odečtení desítky. Takže s 1053 - 2 by 2 musely být nejprve reprezentovány jako 0002 v BCD a desetový doplněk 0002 by musel být vypočítán.

Srovnání s čistou binární

Výhody

  • Mnoho neintegrálních hodnot, například desetinných 0,2, má nekonečnou reprezentaci místní hodnoty v binárních (0,001100110011 ...), ale má konečnou místní hodnotu v binárně kódovaných desítkových soustavách (0,0010). V důsledku toho se systém založený na binárně kódovaných desítkových reprezentacích desetinných zlomků vyhýbá chybám představujícím a vypočítávajícím tyto hodnoty. To je užitečné při finančních výpočtech.
  • Měřítko o síle 10 je jednoduché.
  • Zaokrouhlení na hranici desítkové číslice je jednodušší. Sčítání a odčítání v desítkové soustavě nevyžadují zaokrouhlení.
  • Zarovnání dvou desetinných čísel (například 1,3 + 27,08) je jednoduchý, přesný posun.
  • Převod na znakovou formu nebo pro zobrazení (např. Do textového formátu, jako je XML , nebo pro řízení signálů pro sedmisegmentový displej ) je jednoduché mapování podle číslic a lze jej provádět lineárně ( O ( n )) čas. Konverze z čistého binárního souboru zahrnuje relativně složitou logiku, která zahrnuje číslice, a pro velká čísla není znám žádný algoritmus převodu lineárního času (viz binární číselný systém § Převod do az jiných číselných systémů ).

Nevýhody

  • Některé operace jsou na implementaci složitější. Sčítače vyžadují zvláštní logiku, aby je mohly brzy zabalit a vygenerovat přenos. Pro přidání BCD je zapotřebí o 15 až 20 procent více obvodů ve srovnání s čistě binárními. Násobení vyžaduje použití algoritmů, které jsou poněkud složitější než přidání masky posunu (vyžaduje se binární násobení , které vyžaduje binární posuny a sčítání nebo ekvivalent, na číslici nebo skupinu číslic).
  • Standardní BCD vyžaduje čtyři bity na číslici, zhruba o 20 procent více místa než binární kódování (poměr 4 bity k logu 2 10 bitů je 1,204). Když jsou zabaleny tak, že jsou tři číslice zakódovány do deseti bitů, režie úložiště se výrazně sníží, na úkor kódování, které není zarovnáno s hranicemi 8bitových bajtů běžnými na stávajícím hardwaru, což má za následek pomalejší implementace v těchto systémech.
  • Praktické stávající implementace BCD jsou typicky pomalejší než operace na binárních reprezentacích, zejména na vestavěných systémech, kvůli omezené podpoře procesorů pro nativní operace BCD.

Reprezentační variace

Existují různé implementace BCD, které využívají jiné reprezentace čísel. Programovatelné kalkulačky vyráběné společnostmi Texas Instruments , Hewlett-Packard a dalšími obvykle používají formát BCD s plovoucí desetinnou čárkou , obvykle se dvěma nebo třemi číslicemi pro (desítkový) exponent. Extra bity znakové číslice mohou být použity k označení speciálních číselných hodnot, jako je nekonečno , podtečení / přetečení a chyba (blikající displej).

Podepsané variace

Podepsané desetinné hodnoty mohou být reprezentovány několika způsoby. COBOL programovací jazyk, například podporuje pět pásmová formáty desítkové, přičemž každý z nich kóduje číselné znamení jiným způsobem:

Typ Popis Příklad
Nepodepsaný Žádné známky okusování F1 F2 F3
Podepsané koncové (kanonický formát) Podepište okusování v posledním (nejméně významném) bajtu F1 F2 C3
Podepsané vedení (overpunch) Podepište okusování v prvním (nejvýznamnějším) bajtu C1 F2 F3
Podepsáno na konci odděleně Oddělte bajt znakového znaku ( '+'nebo '−') za bajty číslic F1 F2 F3 2B
Podepsáno vedoucí separát Oddělený bajt znakového znaku ( '+'nebo '−') před bajty číslic 2B F1 F2 F3

Telefonie binárně kódované desítkově (TBCD)

3GPP vyvinul TBCD , rozšíření do BCD, kde se zbývající (nepoužité) bitové kombinace používají k přidání konkrétních telefonních znaků, s číslicemi podobnými číslicím, které se nacházejí v původním designu telefonních klávesnic .

Desetinná
číslice
TBCD
8 4 2 1
* 1 0 1 0
# 1 0 1 1
A 1 1 0 0
b 1 1 0 1
C 1 1 1 0
Používá se jako výplň v případě lichého počtu číslic 1 1 1 1

Zmíněný dokument 3GPP definuje TBCD-STRING s prohozenými nibble v každém bajtu. Bity, oktety a číslice indexované od 1, bity zprava, číslice a oktety zleva.

bity 8765 oktetu n kódující číslice 2 n

bity 4321 oktetu n kódující číslice 2 ( n - 1) + 1

Významové číslo 1234by se stalo 21 43v TBCD.

Alternativní kódování

Pokud jsou chyby v reprezentaci a výpočtu důležitější než rychlost převodu na a ze zobrazení, lze použít zmenšenou binární reprezentaci, která ukládá desítkové číslo jako celé číslo s binárním kódováním a binárně kódovaný podepsaný desítkový exponent. Například 0,2 může být reprezentováno jako 2 × 10 - 1 .

Tato reprezentace umožňuje rychlé násobení a dělení, ale může vyžadovat posunutí o mocninu 10 během sčítání a odčítání, aby se zarovnaly desetinné čárky. Je vhodný pro aplikace s pevným počtem desetinných míst, které pak tuto úpravu nevyžadují - zejména finanční aplikace, kde obvykle stačí 2 nebo 4 číslice za desetinnou čárkou. Ve skutečnosti je to téměř forma aritmetiky pevných bodů, protože poloha bodu radixu je implikována.

Tyto Hertz a Chen-ho kódování poskytuje logické transformace pro konverzi skupiny tří BCD kódované číslic, a 10-bitové hodnoty, které mohou být účinně zakódovaných v hardwaru pouze 2 nebo 3 brány zpoždění. Hustě zabalené desetinné číslo (DPD) je podobné schéma, které se používá pro většinu významů , kromě úvodní číslice, pro jedno ze dvou alternativních desetinných kódování uvedených ve standardu IEEE 754-2008 s plovoucí desetinnou čárkou.

aplikace

BIOS v mnoha osobních počítačů ukládá datum a čas v BCD, protože MC6818 real-time clock čip použitý v originálním IBM PC AT základní deska za předpokladu, že čas zakódované v BCD. Tento formulář lze snadno převést na ASCII pro zobrazení.

Atari 8-bit family počítačů používá BCD realizovat s plovoucí desetinnou čárkou algoritmy. 6502 MOS procesor má režim BCD, která ovlivňuje instrukce sčítání a odčítání. Na Psion Organizer 1 software dodaný výrobcem kapesní počítač je také zcela použity BCD realizovat s plovoucí desetinnou čárkou; pozdější modely Psion používaly výhradně binární.

Starší modely PlayStation 3 ukládají datum a čas do BCD. To vedlo k celosvětovému výpadku konzoly dne 1. března 2010. Poslední dvě číslice roku uložené jako BCD byly nesprávně interpretovány jako 16, což způsobilo chybu v datu jednotky, což způsobilo nefunkčnost většiny funkcí. Toto bylo označováno jako problém roku 2010 .

Právní historie

V případě 1972 Gottschalk v. Benson , americký nejvyšší soud zrušil rozhodnutí nižšího soudu , které umožnilo patent pro převod čísel kódovaných BCD na binární na počítači. Rozhodnutí uvádí, že patent „by zcela předcházel matematickému vzorci a v praxi by byl patentem na samotný algoritmus “. Toto byl zásadní úsudek, který určoval patentovatelnost softwaru a algoritmů.

Viz také

Poznámky

Reference

Další čtení

externí odkazy