Desetinné číslo s plovoucí desetinnou čárkou - Decimal floating point

Desítková aritmetika s plovoucí desetinnou čárkou ( DFP ) označuje reprezentaci i operace s desítkovými čísly s plovoucí desetinnou čárkou . Přímá práce s desetinnými zlomky (základ-10) může zabránit zaokrouhlovacím chybám, které se jinak obvykle vyskytují při převodu mezi desetinnými zlomky (běžnými v datech zadávaných lidmi, jako jsou měření nebo finanční informace) a binárními zlomky (základ-2).

Výhoda desetinné reprezentace s plovoucí desetinnou čárkou oproti desetinné reprezentaci s pevnou čárkou a celočíselnou reprezentací spočívá v tom, že podporuje mnohem širší rozsah hodnot. Například zatímco reprezentace s pevnou řádovou čárkou, která přiděluje 8 desetinných číslic a 2 desetinná místa, může představovat čísla 123456,78, 8765,43, 123,00 atd., Reprezentace s plovoucí desetinnou čárkou s 8 desetinnými číslicemi může také představovat 1,2345678, 1234567,8, 0,000012345678, 12345678000000000 atd. Tento širší rozsah může dramaticky zpomalit hromadění chyb zaokrouhlování během postupných výpočtů; například Kahanův sumační algoritmus lze použít v plovoucí čárce k přidání mnoha čísel bez asymptotické akumulace chyby zaokrouhlování.

Implementace

Časná mechanická použití desetinné čárky jsou evidentní v počítadle , pravidle snímku , kalkulačce Smallwood a některých dalších kalkulačkách, které podporují zápisy do vědecké notace . V případě mechanických kalkulaček je s exponentem často zacházeno jako s vedlejšími informacemi, které jsou účtovány samostatně.

Počítač IBM 650 podporoval v roce 1953 8místný desítkový formát s plovoucí desetinnou čárkou. Jinak binární Wang VS stroj podporoval 64bitový desítkový formát s plovoucí desetinnou čárkou v roce 1977. Knihovna podpory s plovoucí desetinnou čárkou pro procesor Motorola 68040 poskytovala 96 -bitový desítkový formát s plovoucí desetinnou čárkou v roce 1990.

Některé počítačové jazyky mají implementaci desítkové aritmetiky s pohyblivou řádovou čárkou, včetně PL/I , C# , Java s velkým desetinným číslem , emacs s calcem a Pythonův desítkový modul. V roce 1987, IEEE povolený IEEE 854 , standardní pro výpočet s desetinnou plovoucí desetinnou čárkou, která postrádala specifikace pro to, jak by měly být s plovoucí desetinnou čárkou dat kódován pro výměnu s jinými systémy. To bylo následně řešeno v IEEE 754-2008 , který standardizoval kódování desítkových dat s plovoucí desetinnou čárkou, i když dvěma různými alternativními metodami.

Procesory IBM POWER6 a novější POWER zahrnují DFP v hardwaru, stejně jako počítače IBM System z9 (a novější zSeries). SilMinds nabízí SilAx, konfigurovatelný vektorový koprocesor DFP . IEEE 754-2008 to definuje podrobněji. Fujitsu má také 64bitové procesory Sparc s hardwarem DFP.

Microsoft C#nebo .NET používá System.Decimal.

Kódování IEEE 754-2008

Standard IEEE 754-2008 definuje 32-, 64- a 128bitové desetinné reprezentace s plovoucí desetinnou čárkou. Stejně jako binární formáty s plovoucí desetinnou čárkou je číslo rozděleno na znaménko, exponent a význam . Na rozdíl od binárních bodů s plovoucí desetinnou čárkou nejsou čísla nutně normalizována; hodnoty s několika platnými číslicemi mají více možných reprezentací: 1 × 10 2 = 0,1 × 10 3 = 0,01 × 10 4 atd. Je -li význam nula, může být exponentem libovolná hodnota.

IEEE 754-2008 desítkové formáty s plovoucí desetinnou čárkou
decimal32 decimal64 desetinné číslo 128 desetinné číslo (32 k ) Formát
1 1 1 1 Znakové pole (bity)
5 5 5 5 Kombinační pole (bity)
6 8 12 w = 2 × k + 4 Pole pokračování exponentu (bity)
20 50 110 t = 30 × k −10 Pole pro pokračování koeficientu (bity)
32 64 128 32 × k Celková velikost (bity)
7 16 34 p = 3 × t /10+1 = 9 × k −2 Velikost koeficientu (desetinné číslice)
192 768 12288 3 × 2 w = 48 × 4 k Rozsah exponentů
96 384 6144 Emax = 3 × 2 w −1 Největší hodnota je 9,99 ... × 10 Emax
-95 −383 -6143 Emin = 1 − Emax Nejmenší normalizovaná hodnota je 1,00 ... × 10 Emin
−101 -398 -6176 Etiny = 2 − p − Emax Nejmenší nenulová hodnota je 1 × 10 Etiny

Rozsahy exponentů byly zvoleny tak, aby rozsah dostupný pro normalizované hodnoty byl přibližně symetrický. Protože to nelze provést přesně se sudým počtem možných hodnot exponentu, byla extra hodnota dána Emax.

Jsou definována dvě různá zobrazení:

  • Jeden s binárním celočíselným polem významů kóduje význam jako velké binární celé číslo mezi 0 a 10 p −1. Očekává se, že to bude pohodlnější pro softwarové implementace využívající binární ALU .
  • Další s hustě zabaleným desetinným významovým polem kóduje desetinné číslice přímo. Díky tomu je převod do a z binární formy s plovoucí desetinnou čárkou rychlejší, ale pro efektivní manipulaci vyžaduje specializovaný hardware. Očekává se, že to bude výhodnější pro hardwarové implementace.

Obě alternativy poskytují přesně stejný rozsah reprezentativních hodnot.

Nejvýznamnější dva bity exponentu jsou omezeny na rozsah 0−2 a nejvýznamnější 4 bity významu jsou omezeny na rozsah 0−9. 30 možných kombinací je zakódováno v 5bitovém poli spolu se speciálními formami pro nekonečno a NaN .

Pokud jsou nejvýznamnější 4 bity významu mezi 0 a 7, kódovaná hodnota začíná takto:

s 00mmm xxx   Exponent begins with 00, significand with 0mmm
s 01mmm xxx   Exponent begins with 01, significand with 0mmm
s 10mmm xxx   Exponent begins with 10, significand with 0mmm

Pokud jsou úvodní 4 bity významu binární 1000 nebo 1001 (desetinné 8 nebo 9), číslo začíná takto:

s 1100m xxx   Exponent begins with 00, significand with 100m
s 1101m xxx   Exponent begins with 01, significand with 100m
s 1110m xxx   Exponent begins with 10, significand with 100m

Úvodní bit (s ve výše uvedeném) je znaménkový bit a následující bity (xxx ve výše uvedeném) kódují další exponentní bity a zbytek nejvýznamnější číslice, ale podrobnosti se liší v závislosti na použité alternativě kódování.

Konečné kombinace se používají pro nekonečna a NaN a jsou stejné pro obě alternativní kódování:

s 11110 x   ±Infinity (see Extended real number line)
s 11111 0   quiet NaN (sign bit ignored)
s 11111 1   signaling NaN (sign bit ignored)

V posledně uvedených případech jsou všechny ostatní bity kódování ignorovány. Je tedy možné inicializovat pole na NaN vyplněním jednou bajtovou hodnotou.

Pole s významem binárních celých čísel

Tento formát používá binární význam od 0 do 10 p -1. Například význam Decimal32 může být až 10 7 −1 = 9 999 999 = 98967F 16 = 1001 1000100101 1001111111 2 . Zatímco kódování může představovat větší významy, jsou nezákonné a standard vyžaduje implementace, aby je považovaly za 0, pokud se vyskytnou na vstupu.

Jak je popsáno výše, kódování se mění v závislosti na tom, zda jsou nejvýznamnější 4 bity významu v rozsahu 0 až 7 (0000 2 až 0111 2 ) nebo vyšší (1000 2 nebo 1001 2 ).

Pokud jsou 2 bity za znaménkovým bitem „00“, „01“ nebo „10“, pak pole exponent sestává z 8 bitů následujících za znaménkovým bitem (zmíněné 2 bity plus 6 bitů „pole pokračování exponentu“) , a the Meannd je zbývajících 23 bitů s implicitním úvodním 0 bitem, které jsou zde uvedeny v závorkách:

 s 00eeeeee   (0)ttt tttttttttt tttttttttt
 s 01eeeeee   (0)ttt tttttttttt tttttttttt
 s 10eeeeee   (0)ttt tttttttttt tttttttttt

To zahrnuje subnormální čísla, kde počáteční významná číslice je 0.

Pokud jsou 2 bity za znaménkovým bitem „11“, pak se 8bitové pole exponentu posune o 2 bity doprava (po znaménkovém bitu i poté po „11“ bitech) a reprezentovaný význam je ve zbývajícím 21 bitů. V tomto případě existuje implicitní (tj. Není uložena) úvodní 3bitová sekvence „100“ ve skutečném významu:

 s 1100eeeeee (100)t tttttttttt tttttttttt
 s 1101eeeeee (100)t tttttttttt tttttttttt
 s 1110eeeeee (100)t tttttttttt tttttttttt

2bitová sekvence „11“ za znaménkovým bitem indikuje, že k významu je implicitní 3bitová předpona „100“.

Všimněte si, že vedoucí bity pole significand to není kódovat Nejvýznamnější desítkovou číslici; jsou prostě součástí většího čistě binárního čísla. Například význam 8 000 000 je kódován jako binární 0111 1010000100 1000000000 , přičemž přední 4 bity kódují 7; první význam, který vyžaduje 24. bit (a tedy i druhou formu kódování) je 2 23 = 8 388 608 .

Ve výše uvedených případech je reprezentovaná hodnota:

(−1) znaménko × 10 exponent − 101 × významný

Decimal64 a Decimal128 fungují analogicky, ale s větším exponentovým pokračováním a významnými poli. Pro Decimal128 se druhý kódovací formulář ve skutečnosti nikdy nepoužívá; největší platný význam 10 34 −1 = 1ED09BEAD87C0378D8E63FFFFFFFF 16 může být reprezentován 113 bity.

Hustě zabalené desítkové pole

V této verzi je význam uložen jako řada desetinných číslic. Úvodní číslice je mezi 0 a 9 (3 nebo 4 binární bity) a zbytek významu používá hustě zabalené dekadické (DPD) kódování.

Úvodní 2 bity exponentu a úvodní číslice (3 nebo 4 bity) významu jsou sloučeny do pěti bitů, které následují za znaménkovým bitem. Následuje pole pokračování exponentu s pevným offsetem.

Nakonec významné pole pro pokračování vytvořené ze 2, 5 nebo 11 10bitových decletů , z nichž každé kóduje 3 desetinná místa.

Pokud jsou první dva bity za znaménkovým bitem „00“, „01“ nebo „10“, pak se jedná o úvodní bity exponentu a tři bity poté jsou interpretovány jako úvodní desetinná číslice (0 až 7) ):

    Comb.  Exponent          Significand
 s 00 TTT (00)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 01 TTT (01)eeeeee (0TTT)[tttttttttt][tttttttttt]
 s 10 TTT (10)eeeeee (0TTT)[tttttttttt][tttttttttt]

Pokud jsou první dva bity za znaménkovým bitem „11“, pak druhé dva bity jsou úvodními bity exponentu a poslední bit má předponu „100“, aby se vytvořila úvodní desetinná číslice (8 nebo 9):

    Comb.  Exponent          Significand
 s 1100 T (00)eeeeee (100T)[tttttttttt][tttttttttt]
 s 1101 T (01)eeeeee (100T)[tttttttttt][tttttttttt]
 s 1110 T (10)eeeeee (100T)[tttttttttt][tttttttttt]

Zbývající dvě kombinace (11110 a 11111) 5bitového pole se použijí k reprezentaci ± nekonečna a NaNs.

Aritmetické operace s pohyblivou řádovou čárkou

Obvyklé pravidlo pro provádění aritmetiky s pohyblivou řádovou čárkou je, že se vypočítá přesná matematická hodnota a výsledek se pak zaokrouhlí na nejbližší reprezentovatelnou hodnotu se zadanou přesností. Toto je ve skutečnosti chování nařízené pro počítačový hardware kompatibilní s IEEE, za normálního chování zaokrouhlování a při absenci výjimečných podmínek.

Pro snadnou prezentaci a porozumění bude v příkladech použita 7místná přesnost. Základní principy jsou v jakékoli přesnosti stejné.

Přidání

Jednoduchou metodou přidání čísel s plovoucí desetinnou čárkou je nejprve je reprezentovat stejným exponentem. V níže uvedeném příkladu je druhé číslo posunuto o 3 číslice doprava. Pokračujeme obvyklou metodou sčítání:

Následující příklad je desetinný, což jednoduše znamená, že základna je 10.

  123456.7 = 1.234567 × 105
  101.7654 = 1.017654 × 102 = 0.001017654 × 105

Proto:

  123456.7 + 101.7654 = (1.234567 × 105) + (1.017654 × 102)
                      = (1.234567 × 105) + (0.001017654 × 105)
                      = 105 × (1.234567 + 0.001017654)
                      = 105 × 1.235584654

Nejde o nic jiného, ​​než o převod na vědecký zápis . Podrobně:

  e=5;  s=1.234567     (123456.7)
+ e=2;  s=1.017654     (101.7654)
  e=5;  s=1.234567
+ e=5;  s=0.001017654  (after shifting)
--------------------
  e=5;  s=1.235584654  (true sum: 123558.4654)

Toto je skutečný výsledek, přesný součet operandů. Zaokrouhlí se na 7 číslic a v případě potřeby se normalizuje. Konečný výsledek je:

  e=5;  s=1.235585    (final sum: 123558.5)

Všimněte si, že nízké 3 číslice druhého operandu (654) jsou v podstatě ztraceny. Toto je chyba zaokrouhlení . V extrémních případech může být součet dvou nenulových čísel roven jednomu z nich:

  e=5;  s=1.234567
+ e=−3; s=9.876543
  e=5;  s=1.234567
+ e=5;  s=0.00000009876543 (after shifting)
----------------------
  e=5;  s=1.23456709876543 (true sum)
  e=5;  s=1.234567         (after rounding/normalization)

Další problém ztráty významnosti nastává, když jsou odečtena dvě blízká čísla. e = 5; s = 1,234571 a e = 5; s = 1,234567 jsou reprezentace racionálů 123457.1467 a 123456.659.

  e=5;  s=1.234571
− e=5;  s=1.234567
----------------
  e=5;  s=0.000004
  e=−1; s=4.000000 (after rounding/normalization)

Nejlepší reprezentací tohoto rozdílu je e = −1; s = 4,877 000, což se liší o více než 20% od e = -1; s = 4,000000. V extrémních případech může být konečný výsledek nulový, přestože přesný výpočet může být několik milionů. Toto zrušení ukazuje nebezpečí za předpokladu, že všechny číslice vypočítaného výsledku mají smysl.

Řešení následků těchto chyb jsou témata numerické analýzy .

Násobení

Aby se znásobily, násobí se významy, zatímco se přidají exponenty a výsledek se zaokrouhlí a normalizuje.

  e=3;  s=4.734612
× e=5;  s=5.417242
-----------------------
  e=8;  s=25.648538980104 (true product)
  e=8;  s=25.64854        (after rounding)
  e=9;  s=2.564854        (after normalization)

Rozdělení se provádí podobně, ale to je složitější.

Při násobení nebo dělení nejsou žádné problémy se zrušením nebo absorpcí, přestože se při opakovaném provádění operací mohou hromadit malé chyby. V praxi může být způsob provádění těchto operací v digitální logice poměrně složitý.

Viz také

Reference

Další čtení