Aritmetika s pevným bodem - Fixed-point arithmetic

V oblasti výpočetní techniky se pevný bod vztahuje ke způsobu reprezentace zlomkových (neceločíselných) čísel ukládáním pevného počtu číslic jejich zlomkové části. Dolarové částky jsou například často uloženy přesně se dvěma zlomkovými číslicemi, což představuje centy (1/100 dolaru). Obecněji může termín odkazovat na reprezentaci zlomkových hodnot jako celočíselné násobky nějaké pevné malé jednotky, např. Zlomkové množství hodin jako celočíselný násobek desetiminutových intervalů. Reprezentace čísel s pevnou čárkou je často v kontrastu ke složitější a výpočetně náročnější reprezentaci s plovoucí desetinnou čárkou .

V reprezentaci s pevným bodem je zlomek často vyjádřen ve stejné číselné základně jako celočíselná část, ale pomocí záporných mocnin báze b . Nejběžnější varianty jsou desítkové (základ 10) a binární (základ 2). Ten je běžně známý také jako binární škálování . Tak, jestliže n se frakce číslice uloženy, hodnota bude vždy celé číslo násobek o b - n . Reprezentaci s pevným bodem lze také použít k vynechání číslic nižších řádů celočíselných hodnot, např. Když reprezentujete velké hodnoty dolaru jako násobky 1000 $.

Když se pro čtení pro člověka zobrazují desetinná čísla s pevnou řádovou čárkou, jsou zlomkové číslice obvykle odděleny od čísel celé části radixovým znakem (obvykle '.' V angličtině, ale ',' nebo jiným symbolem v mnoha dalších jazycích). Interně však neexistuje žádné oddělení a rozdíl mezi těmito dvěma skupinami číslic je definován pouze programy, které taková čísla zpracovávají.

V mechanických kalkulačkách byla normou reprezentace pevného bodu . Protože většina moderních procesorůjednotku rychlé plovoucí čárky (FPU), reprezentace s pevnou řádovou čárkou se nyní používají pouze ve zvláštních situacích, například v levných vestavěných mikroprocesorech a mikrokontrolérech ; v aplikacích, které vyžadují vysokou rychlost a/nebo nízkou spotřebu energie a/nebo malou oblast čipu , jako je zpracování obrazu , videa a digitálního signálu ; nebo když je jejich použití pro problém přirozenější. Příklady těch druhých jsou účtování v dolarech, kdy zlomky centů musí být zaokrouhleny na celé centy přísně předepsanými způsoby; a vyhodnocení funkcí pomocí vyhledávání v tabulce .

Reprezentace

Reprezentace s pevným bodem s měřítkem 1/100

Zastoupená hodnota
Vnitřní
reprezentace
0,00 0
0,5 50
0,99 99
2 200
−14,1 −1410
314,160 31416

Reprezentace zlomkového čísla v pevném bodě je v podstatě celé číslo, které má být implicitně vynásobeno pevným faktorem škálování. Například hodnotu 1,23 lze uložit do proměnné jako celočíselnou hodnotu 1230 s implicitním faktorem škálování 1/1000 (což znamená, že poslední 3 desetinná místa jsou implicitně považována za desetinnou část) a hodnota 1 230 000 může být reprezentován jako 1230 s implicitním faktorem škálování 1000 (s „mínus 3“ implikovanými desítkovými číslicemi, tj. se 3 implicitními nulovými číslicemi vpravo). Tato reprezentace umožňuje standardním celočíselným aritmetickým jednotkám provádět racionální výpočty čísel .

Záporné hodnoty jsou obvykle reprezentovány v binárním formátu s pevným bodem jako celé číslo se znaménkem ve dvojkové reprezentaci komplementu s implicitním faktorem škálování, jak je uvedeno výše. Znaménko hodnoty bude vždy indikováno prvním uloženým bitem (1 = záporný, 0 = nezáporný), i když počet zlomkových bitů je větší nebo roven celkovému počtu bitů. Například 8bitové binární číslo se znaménkem (11110101) 2 = −11, brané s -3, +5 a +12 implikované zlomky bitů, by představovalo hodnoty −11/2 −3 = −88, −11/ 2 5 = −0. 343 75 , a −11/2 12 = −0. 002 685 546 875 .

Alternativně mohou být záporné hodnoty reprezentovány celým číslem ve formátu znaménka , v takovém případě není znaménko nikdy zahrnuto v počtu implikovaných zlomkových bitů. Tato varianta se častěji používá v desítkové aritmetice s pevnou řádovou čárkou. Znaménková 5místná desetinná čísla (−00025) 10 , braná s -3, +5 a +12 implicitní desetinné číslice, by tedy představovala hodnoty −25/10 −3 = −25000, −25/10 5 = −0,00025 a −25/10 12 = −0. 000 000 000 025 , resp.

Program obvykle předpokládá, že všechny hodnoty s pevným bodem, které budou uloženy do dané proměnné nebo budou vytvořeny danou instrukcí , budou mít stejný faktor měřítka. Tento parametr může obvykle zvolit programátor v závislosti na požadované přesnosti a rozsahu hodnot, které mají být uloženy.

Faktor změny měřítka proměnné nebo vzorce se v programu nemusí výslovně objevit. Správná programovací praxe pak vyžaduje, aby byla uvedena v dokumentaci , alespoň jako komentář ve zdrojovém kódu .

Volba faktorů škálování

Pro větší účinnost jsou faktory škálování často voleny jako mocniny (kladné nebo záporné) báze b používané k internímu reprezentování celých čísel. Nejlepší faktor škálování je však často diktován aplikací. Proto člověk často používá škálovací faktory, které jsou mocninami 10 (např. 1/100 pro hodnoty dolaru), pro pohodlí člověka, i když jsou celá čísla interně reprezentována binárně. Desetinné měřítkové faktory také dobře zapadají do metrického (SI) systému , protože volba měřítka pevného bodu je často ekvivalentní volbě měrné jednotky (jako centimetry nebo mikrony místo metrů ).

Příležitostně však mohou být použity i jiné faktory škálování, např. Zlomkové množství hodin může být reprezentováno jako celočíselný počet sekund; tj. jako číslo s pevným bodem s faktorem měřítka 1/3600.

I při nejpečlivějším zaokrouhlování mohou mít hodnoty s pevným bodem reprezentované měřítkovým faktorem S chybu až ± 0,5 v uloženém čísle, tj. ± 0,5 S v hodnotě. Menší faktory škálování proto obecně přinášejí přesnější výsledky.

Na druhé straně menší faktor škálování znamená menší rozsah hodnot, které lze uložit do dané programové proměnné. Maximální hodnota pevného bodu, kterou lze uložit do proměnné, je největší celočíselná hodnota, kterou lze do ní uložit, vynásobená faktorem škálování; a podobně pro minimální hodnotu. V následující tabulce je například uveden implicitní faktor škálování S , minimální a maximální reprezentovatelné hodnoty V min a V max a přesnost δ = S /2 hodnot, které by mohly být zastoupeny v 16bitovém formátu binárního pevného bodu v závislosti na na počtu f implikovaných zlomkových bitů.

Parametry některých 16bitových podepsaných binárních formátů s pevným bodem
F S δ V min V max
−3 1/2 −3 = 8 4 - 262 144 + 262 143
0 1/2 0 = 1 0,5 - 32 768 + 32 767
5 1/2 5 = 1/32 <0,016 −1024. 000 00 +1023. 968 75
14 1/2 14 = 1/16 384 <0 000 031 −2. 000 000 000 000 00 00 +1. 999 938 964 843 75
15 1/2 15 = 1/32 768 <0,000 016 -1. 000 000 000 000 000 000 +0. 999 969 482 421 875
16 1/2 16 = 1/65 536 <0 000 008 −0. 500 000 000 000 000 000 0 +0. 499 984 741 210 937 5
20 1/2 20 = 1/1 048 576 <0 000 000 5 −0. 031 250 000 000 000 000 000 00 +0. 031 249 046 325 683 593 75

Bylo řečeno, že formáty s pevným bodem s faktory škálování ve formě 2 n -1 (jmenovitě 1, 3, 7, 15, 31 atd.) Jsou vhodné pro zpracování obrazu a další úlohy pro zpracování digitálního signálu. Mají poskytovat konzistentnější převody mezi hodnotami s pevnou a pohyblivou řádovou čárkou než obvyklé 2 n škálování. Tyto Julia programovací jazyk implementuje obě varianty.

Přesné hodnoty

Libovolnou binární frakci a /2 m , jako je 1/16 nebo 17/32, lze přesně znázornit v pevném bodě, s faktorem měřítka síly dvou nula n s libovolným nm . Většina desetinných zlomků, jako je 0,1 nebo 0,123, je však nekonečně se opakujících zlomků v základně 2, a proto je nelze takto reprezentovat.

Podobně jakýkoli desetinný zlomek a /10 m , jako je 1/100 nebo 37/1000, může být přesně reprezentován v pevném bodě s faktorem měřítka síly deseti 1/10 n s libovolným nm . Tento desítkový formát může také představovat libovolný binární zlomek a /2 m , například 1/8 (0,125) nebo 17/32 (0,53125).

Obecněji platí, že racionální číslo a / b , s a a b relativně prvočíslem a b kladným, lze přesně vyjádřit v binárním pevném bodě, pouze pokud b je mocnina 2; a v desítkové pevné čárce pouze v případě, že b nemá žádné hlavní faktory jiné než 2 a/nebo 5.

Porovnání s plovoucí desetinnou čárkou

Výpočty s pevnou řádovou čárkou mohou být rychlejší a/nebo používat méně hardwaru než výpočty s pohyblivou řádovou čárkou. Pokud je rozsah hodnot, které mají být reprezentovány, znám předem a je dostatečně omezený, pevný bod může lépe využít dostupné bity. Pokud je například k dispozici 32 bitů pro reprezentaci čísla mezi 0 a 1, reprezentace s pevným bodem může mít chybu menší než 1,2 × 10 −10 , zatímco standardní reprezentace s plovoucí desetinnou čárkou může mít chybu až 596 × 10 −10 - protože 9 bitů je zbytečných se znaménkem a exponentem faktoru dynamického škálování.

Programy využívající výpočty s pevnou řádovou čárkou jsou obvykle přenosnější než ty, které používají pohyblivou řádovou čárku, protože nezávisí na dostupnosti FPU. Tato výhoda byla obzvláště silná před široce přijatým standardem IEEE Floating Point Standard , kdy výpočty s plovoucí desetinnou čárkou se stejnými daty poskytovaly různé výsledky v závislosti na výrobci a často na počítačovém modelu.

Mnoho vestavěných procesorů nemá FPU, protože celočíselné aritmetické jednotky vyžadují podstatně méně logických bran a spotřebovávají mnohem menší plochu čipu než FPU; a softwarová emulace s plovoucí desetinnou čárkou na zařízeních s nízkou rychlostí by byla pro většinu aplikací příliš pomalá. Čipy CPU pro dřívější osobní počítače a herní konzole , jako Intel 386 a 486SX , také postrádaly FPU.

Absolutní rozlišení (rozdíl mezi po sobě následujícími hodnotami) podle kteréhokoliv z formátu pevným bodem je konstantní v celém rozsahu, a to faktoru měřítka S . Naproti tomu relativní rozlišení formátu s plovoucí desetinnou čárkou je přibližně konstantní v celém jejich rozsahu, mění se v rámci faktoru báze b ; zatímco jejich absolutní rozlišení se liší o mnoho řádů, podobně jako samotné hodnoty.

V mnoha případech lze chyby zaokrouhlení a zkrácení u výpočtů s pevným bodem analyzovat snáze než u ekvivalentních výpočtů s plovoucí desetinnou čárkou. Na druhou stranu použití pevného bodu vyžaduje větší péči ze strany programátora. Vyhnutí se přetečení vyžaduje mnohem přísnější odhady pro rozsahy proměnných a všechny mezilehlé hodnoty ve výpočtu a často také další kód pro úpravu jejich faktorů škálování.

Aplikace

Běžné použití desetinných bodů s pevnou desetinnou čárkou je pro ukládání peněžních hodnot, za což jsou často komplikovaná pravidla zaokrouhlování čísel s plovoucí desetinnou čárkou. Například open source aplikace pro správu peněz GnuCash , napsaná v jazyce C, přešla od verze 1.6 z plovoucí desetinné čárky na pevný bod.

Binární pevný bod (binární škálování) byl široce používán od konce šedesátých let do osmdesátých let pro výpočet v reálném čase, který byl matematicky náročný, například simulace letu a řídicí algoritmy jaderných elektráren . Stále se používá v mnoha aplikacích DSP a na zakázku vyráběných mikroprocesorech. Výpočty zahrnující úhly by používaly binární úhlové měření (BAM).

Binární pevný bod se používá v CORDIC koprocesorech řady STM32G4 a v algoritmech diskrétní kosinové transformace (DCT) používaných ke kompresi obrázků JPEG .

Operace

Sčítání a odčítání

Chcete -li přidat nebo odečíst dvě hodnoty se stejným implicitním faktorem škálování, stačí přidat nebo odečíst základní čísla; výsledek bude mít jejich společný implicitní faktor škálování, takže jej lze uložit do stejných programových proměnných jako operandy. Tyto operace přinášejí přesný matematický výsledek, pokud nedojde k přetečení - tj. Pokud lze výsledné celé číslo uložit do proměnné přijímajícího programu . Pokud mají hodnoty různé faktory škálování, musí být před operací převedeny na společný faktor škálování.

Násobení

K vynásobení dvou čísel s pevným bodem stačí znásobit dvě základní celá čísla a předpokládat, že faktor měřítka výsledku je součinem jejich faktorů škálování. Výsledek bude přesný, bez zaokrouhlení, za předpokladu, že nepřeteče přijímající proměnnou.

Například vynásobením čísel 123 v měřítku 1/1000 (0,123) a 25 v měřítku 1/10 (2,5) získáte celé číslo 123 × 25 = 3075 zmenšené o (1/1000) × (1/10) = 1/10000 , tj. 3075/10000 = 0,3075. Jako další příklad vynásobením prvního čísla číslem 155 implicitně škálovaným 1/32 (155/32 = 4,84375) získáte celé číslo 123 × 155 = 19065 s implicitním faktorem škálování (1/1000) × (1/32) = 1/32000 , tj. 19065/32000 = 0,59578125.

Divize

Chcete-li rozdělit dvě čísla s pevným bodem, vezmete jeden celočíselný kvocient jejich podkladových celých čísel a předpokládáte, že faktor měřítka je podíl jejich faktorů škálování. Obecně první dělení vyžaduje zaokrouhlení, a proto výsledek není přesný.

Například dělení 3456 v měřítku 1/100 (34,56) a 1234 v měřítku 1/1000 (1,234) dává celé číslo 3456 ÷ 1234 = 3 (zaokrouhleno) s faktorem měřítka (1/100)/(1/1000) = 10, to znamená 30. Jako další příklad dělíme dělení prvního čísla na 155 implicitně zmenšeno o 1/32 (155/32 = 4,84375) na celé číslo 3456 ÷ 155 = 22 (zaokrouhleno) s implicitním faktorem škálování (1/ 100)/(1/32) = 32/100 = 8/25, tj. 22 × 32/100 = 7,04.

Pokud výsledek není přesný, lze chybu zavedenou zaokrouhlením snížit nebo dokonce odstranit převedením dividendy na menší faktor škálování. Pokud je například r = 1,23 reprezentováno jako 123 se škálováním 1/100 a s = 6,25 je reprezentováno jako 6250 se škálováním 1/1000, pak jednoduché dělení celých čísel získá 123 ÷ 6250 = 0 (zaokrouhleno) s měřítkovým faktorem ( 1/100)/(1/1000) = 10. Pokud je r nejprve převedeno na 1 230 000 s faktorem měřítka 1/1000000, bude výsledkem 1 230 000 ÷ 6250 = 197 (zaokrouhleno) s faktorem měřítka 1/1000 (0,197). Přesná hodnota 1,23/6,25 je 0,1968.

Převod měřítka

Při výpočtu s pevným bodem je často nutné převést hodnotu na jiný faktor škálování. Tato operace je nezbytná, například:

  • Chcete -li uložit hodnotu do programové proměnné, která má jiný implicitní faktor škálování;
  • Chcete -li převést dvě hodnoty na stejný faktor měřítka, aby je bylo možné sčítat nebo odčítat;
  • Obnovení původního měřítka hodnoty po vynásobení nebo dělení jinou;
  • Zlepšit přesnost výsledku rozdělení;
  • Aby se zajistilo, že faktor měřítka produktu nebo kvocientu je jednoduchá síla jako 10 n nebo 2 n ;
  • Aby bylo zajištěno, že výsledek operace lze uložit do programové proměnné bez přetečení;
  • Snížení nákladů na hardware, který zpracovává data s pevným bodem.

Chcete-li převést číslo z typu pevným bodem váhových faktorů R na jiný typ s faktorem navýšení S , musí být základní číslo vynásobí poměrem R / S . Například pro převod hodnoty 1,23 = 123/100 z měřítka R = 1/100 na hodnotu s měřítkem S = 1/1000 musí být celé číslo 123 vynásobeno (1/100)/(1/1000 ) = 10, čímž se získá reprezentace 1230/1000.

Pokud je faktor měřítka mocninou základny používané interně k reprezentaci celého čísla, změna faktoru měřítka vyžaduje pouze vynechání číslic nízkého řádu celého čísla nebo připojení nulových číslic. Tato operace však musí zachovat znak čísla. Ve dvojkové reprezentaci komplementu to znamená rozšíření znakového bitu jako u operací s aritmetickým posunem .

Pokud S nerozděluje R (zejména pokud je nový faktor měřítka S větší než původní R ), bude muset být nové celé číslo zaokrouhleno .

Zejména v případě, r a s jsou pevného bodu proměnné, implicitní měřítek R a S , operace rr x y vyžadují vynásobením příslušné celá čísla a výslovně dělením výsledku S . Výsledek může být zaokrouhlen a může dojít k přetečení.

Pokud je například společný faktor měřítka 1/100, vynásobení 1,23 číslem 0,25 znamená vynásobení číslem 123 číslem 25, čímž se získá 3075 s přechodným faktorem měřítka 1/10000. Aby se vrátil k původnímu měřítku 1/100, celé číslo 3075 pak musí být vynásobeno 1/100, tj. Děleno 100, aby bylo získáno buď 31 (0,31) nebo 30 (0,30), v závislosti na zásadách zaokrouhlování použitý.

Podobně operace rr / s bude vyžadovat rozdělení celá čísla a výslovně vynásobením S . I zde může dojít k zaokrouhlení a/nebo přetečení.

Převod do az plovoucí desetinné čárky

Chcete -li převést číslo z plovoucí desetinné čárky na pevný bod, je možné jej dělit měřítkem S a výsledek zaokrouhlit na nejbližší celé číslo. Je třeba dbát na to, aby výsledek odpovídal cílové proměnné nebo registru. V závislosti na faktoru škálování a velikosti úložiště a na vstupních číslech rozsahu nemusí převod znamenat žádné zaokrouhlování.

Pro převedení pevné číslo přejděte na plovoucí desetinnou čárkou, může se převést na celé číslo s plovoucí desetinnou čárkou a pak množí se faktorem navýšení S . Tato konverze může zahrnovat zaokrouhlení, pokud je absolutní hodnota celého čísla větší než 2 24 (pro binární jednoduchou přesnost IEEE s plovoucí desetinnou čárkou) nebo 2 53 (pro dvojitou přesnost). Přetečení nebo podtečení může dojít, pokud | S | je velmi velký, respektive velmi malý.

Hardwarová podpora

Škálování a renormalizace

Typické procesory nemají specifickou podporu pro aritmetiku s pevným bodem. Většina počítačů s binární aritmetikou má však instrukce pro rychlý bitový posun, které mohou znásobit nebo rozdělit celé číslo libovolnou mocninou 2; zejména instrukce aritmetického posunu . Tyto pokyny lze použít k rychlé změně faktorů škálování, které jsou mocninami 2, při zachování znaménka čísla.

Počáteční počítače jako IBM 1620 a Burroughs B3500 používaly pro celá čísla binárně kódovanou desítkovou (BCD) reprezentaci, konkrétně základnu 10, kde každá desetinná číslice byla nezávisle kódována 4 bity. Některé procesory, například mikrokontroléry, jej mohou stále používat. V takových strojích může být převod faktorů desítkového škálování prováděn bitovými posuny a/nebo manipulací s adresou paměti.

Některé architektury DSP nabízejí nativní podporu pro konkrétní formáty pevných bodů, například podepsaná n -bitová čísla s n -1 zlomkovými bity (jejichž hodnoty se mohou pohybovat mezi -1 a téměř +1). Podpora může zahrnovat multiplikační instrukci, která zahrnuje renormalizaci - převod škálování produktu ze 2 n −2 na n −1 zlomkové bity. Pokud CPU tuto funkci neposkytuje, musí programátor uložit produkt do dostatečně velkého registru nebo dočasné proměnné a renormalizaci explicitně kódovat.

Přetékat

K přetečení dochází, když je výsledek aritmetické operace příliš velký na to, aby byl uložen v určené cílové oblasti. Kromě toho a odčítání může výsledek vyžadovat o jeden bit více než operandy. Při násobení dvou celých čísel bez znaménka m a n bitů může mít výsledek m + n bitů.

V případě přetečení jsou bity vysokého řádu obvykle ztraceny, protože celé číslo bez měřítka se zmenší modulo 2 n, kde n je velikost úložné oblasti. Ztrácí se zejména znaménkový bit, což může radikálně změnit znaménko a velikost hodnoty.

Některé procesory mohou nastavit příznak přetečení hardwaru a/nebo generovat výjimku v případě přetečení. Některé procesory mohou místo toho poskytovat aritmetiku nasycení : pokud by došlo k přetečení výsledku sčítání nebo odčítání, místo toho uloží hodnotu s největší velikostí, která se vejde do přijímací oblasti a má správné znaménko.

Tyto funkce však nejsou v praxi příliš užitečné; obecně je snazší a bezpečnější vybrat faktory škálování a velikosti slov tak, aby byla vyloučena možnost přetečení, nebo před provedením operace zkontrolovat, zda operandy nemají nadměrné hodnoty.

Podpora počítačového jazyka

Explicitní podporu pro reprezentaci a výpočty s pevným bodem poskytovalo několik počítačových jazyků, zejména PL/I , COBOL , Ada , JOVIAL a Coral 66 . Poskytovaly číselné datové typy s pevným bodem , binární a/nebo desítkové, které bylo možné přiřadit proměnným a funkcím. Kompilátor by pak automaticky vygeneroval kód, který provede příslušné převody škálování při překládání příkazů jako rs × t + u , při čtení nebo zápisu hodnot těchto proměnných nebo při jejich převodu na jiné datové typy, jako je například plovoucí desetinná čárka.

Většina těchto jazyků byla navržena v letech 1940 až 1990. Modernější jazyky obvykle nenabízejí žádné datové typy s pevným bodem ani podporu převodu měřítka. To je také případ několika starších jazyků, které jsou stále velmi populární, jako FORTRAN , C a C ++ . Široká dostupnost rychlých procesorů s plovoucí desetinnou čárkou s přísně standardizovaným chováním výrazně snížila poptávku po podpoře binárních pevných bodů. Podobně podpora pro desetinnou čárku v některých programovacích jazycích, jako je C# a Python , odstranila většinu potřeby podpory desetinné čárky s pevnou čárkou. V několika situacích, které vyžadují operace s pevným bodem, je může implementovat programátor s výslovným převodem škálování v libovolném programovacím jazyce.

Na druhou stranu všechny relační databáze a notace SQL podporují desítkovou aritmetiku s pevným bodem a ukládání čísel. PostgreSQL má speciálníčíselné typ pro přesné ukládání čísel s až 1000 číslicemi.

V roce 2008 navíc Mezinárodní organizace pro normalizaci (ISO) vydala návrh na rozšíření programovacího jazyka C o datové typy s pevnou řádovou čárkou ve prospěch programů běžících na vestavěných procesorech. Také GNU Compiler Collection (GCC) má back-end podporu s pevnou řádovou čárkou.

Podrobné příklady

Násobení desítkovým pevným bodem

Předpokládejme následující násobení se 2 číslicemi s pevnou čárkou a 3 desetinnými místy.

(10,500) (1,050) = 1*10,500 + 0,050*10,500 = 10,500 + 0,525000 = 11,025000

Všimněte si, že protože existují 3 desetinná místa, zobrazujeme koncové nuly. Abychom to znovu charakterizovali jako celočíselné násobení, musíme nejprve vynásobit 1 000 (10^3) ​​přesunutím všech desetinných míst do celých míst, pak vynásobíme (10^-3), abychom je vrátili zpět, rovnice nyní vypadá takto

(10.500)(10^(3)) (1.050)(10^(3))  (10^(-3))(10^(-3))
= (10500)(1050) (10^-6)
= 11 025 000  (10^-6)
= 11.025000

To funguje ekvivalentně, pokud pro výpočet zvolíme jinou základnu, zejména základnu 2, protože bitový posun je stejný jako násobení nebo dělení řádově 2. Tři desetinná místa odpovídají přibližně 10 binárním číslicím, takže bychom měli zaokrouhlit 0,05 až 10 bitů za binárním bodem. Nejbližší aproximace je pak 0,0000110011.

10= 8+2=2^3+2^1
1=2^0
0.5= 2^-1
0.05= 0.0000110011_2

Naše násobení se tedy stává

(1010.100)(2^3)(1.0000110011)(2^10) (2^-13)
=(1010100)(10000110011) (2^-13)
=(10110000010111100) (2^-13)
=1011.0000010111100

Toto se zaokrouhlí na 11,023 se třemi číslicemi za desetinnou čárkou.

Binární násobení s pevným bodem

Zvažte úkol spočítat součin 1,2 a 5,6 pomocí binárního pevného bodu pomocí 16 zlomkových bitů. Aby reprezentoval dvě čísla, jedno je vynásobí 2 16 a získá 78 643,2 a 367 001, 6; a zaokrouhlí tyto hodnoty na nejbližší celá čísla, získá 78 783 a 367 002 . Tato čísla se pohodlně vejdou do 32bitového slova s ​​podepsaným formátem dvou doplňků.

Vynásobením těchto celých čísel dohromady získáte 35bitové celé číslo 28 862 138 286 s 32 zlomkovými bity, bez jakéhokoli zaokrouhlování. Uvědomte si, že uložení této hodnoty přímo do 32bitové celočíselné proměnné by mělo za následek přetečení a ztrátu nejvýznamnějších bitů. V praxi by to pravděpodobně bylo uloženo v podepsané 64bitové celočíselné proměnné nebo registru .

Pokud má být výsledek uložen ve stejném formátu jako data, se 16 zlomkovými bity, mělo by být toto celé číslo děleno 2 16 , což dává přibližně 440 401,28, a poté zaokrouhleno na nejbližší celé číslo. Tohoto efektu lze dosáhnout přidáním 2 15 a následným posunutím výsledku o 16 bitů. Výsledkem je 440 401 , což představuje hodnotu 6. 719 985 961 914 062 5 . S přihlédnutím k přesnosti formátu je tato hodnota lépe vyjádřena jako 6 719 986 ± 0 000 008 (nepočítaje chybu, která pochází z aproximací operandu). Správný výsledek by byl 1,2 × 5,6 = 6,72.

U složitějšího příkladu předpokládejme, že dvě čísla 1,2 a 5,6 jsou reprezentována ve 32bitovém formátu pevného bodu s 30 a 20 zlomkovými bity. Zvětšením o 2 30 a 2 20 se získá 1 288 490 188,8 a 5 872 025,6, tedy zaokrouhleno na 1 288 490 189, respektive 5 872 026 . Obě čísla se stále vejdou do 32bitové celočíselné proměnné se znaménkem a představují zlomky

1. 200 000 000 186 264 514 923 095 703 125 a
5. 600 000 381 469 726 562 50

Jejich produktem je (přesně) 53bitové celé číslo 7 566 047 890 552 914 , které má 30+20 = 50 implikovaných zlomkových bitů, a proto představuje zlomek

6. 720 000 458 806 753 229 623 609 513 510

Pokud se rozhodneme reprezentovat tuto hodnotu v podepsaném 16bitovém pevném formátu s 8 zlomkovými bity, musíme celočíselný součin vydělit 2 50-8 = 2 42 a výsledek zaokrouhlit; čehož lze dosáhnout přidáním 2 41 a posunutím o 42 bitů. Výsledkem je 1720, což představuje hodnotu 1720/2 8 = 6. 718 75 , tedy přibližně 6 719 ± 0,002.


Zápisy

Pro výstižnou specifikaci parametrů formátu s pevným bodem byly použity různé notace. V následujícím seznamu f představuje počet zlomkových bitů, m počet bitů velikosti nebo celého čísla, s počet znaménkových bitů a b celkový počet bitů.

  • COBOL programovací jazyk původně podporován desetinnou pevnou přesnost s libovolné velikosti a měřítka desetinné, jejichž formát byl zadán „graficky“ se PICsměrnicí. Například PIC S9999V99zadali 6místné desetinné číslo se znaménkovou velikostí se dvěma desetinnými číslicemi.
  • Konstrukt REAL FIXED BINARY (p ,f) byl použit v programovacím jazyce PL/I k určení binárního datového typu se znaménkem s pevným bodem s p celkovými bity (bez znaménka) s f bity ve zlomkové části; to je celé číslo se znaménkem p +1 s bitovým měřítkem 1/2 f . Ten může být pozitivní nebo negativní. Dalo by se určit COMPLEXmísto REALa DECIMALmísto BINARYpro základnu 10.
  • V programovacím jazyce Ada by mohl být numerický datový typ specifikován například tím, že type F is delta 0.01 range -100.0 .. 100.0by to znamenalo reprezentaci s pevným bodem skládající se z binárního čísla se znaménkem ve formátu komplementu dvou se 7 implikovanými zlomkovými bity (poskytující měřítkový faktor 1/128) a celkem nejméně 15 bitů (zajišťující skutečný rozsah od -128,00 do téměř +128,00).
  • Zápis Q byl definován společností Texas Instruments . Jeden zapíše Qf, aby určil podepsanou binární hodnotu pevného bodu s f zlomky bitů; například Q15určuje celé číslo se znaménkem v zápisu komplementu dvou s faktorem měřítka 1/2 15 . Kód Qm .f navíc určuje, že číslo má m bitů v celé části hodnoty, nepočítaje znaménkový bit. Tak Q1.30by se popsal binární formát s pevným bodem s 1 celočíselným bitem a 30 zlomkovými bity, který by mohl být uložen jako celé číslo komplementu 32 bitů 2 s faktorem měřítka 1/2 30 . Podobný zápis byl použit ARM , kromě toho, že počítají znaménkový bit v hodnotě m ; takže stejný formát výše by byl specifikován jako Q2.30.
  • Zápis Bm byl použit k označení pevného binárního formátu s m bity v celočíselné části; zbytek slova jsou zlomky bitů. Například maximální a minimální hodnoty, které lze uložit pod podepsané B16číslo, jsou ≈32767.9999847 a −32768.0.
  • Společnost VisSim použila fxm .b k označení binární hodnoty pevného bodu s b celkovými bity a m bity v celočíselné části; to je, b bitové celé číslo se faktor měřítka 1/2 B - m . To fx1.16by znamenalo 16bitové číslo s 1 bitem v celočíselné části a 15 ve zlomku.
  • Na PS2 GS ( "Graphics Synthesizer" ) Uživatelská příručka používá notaci s :m :f , kde je určující přítomnost (0 nebo 1) znakové bitu. 0:5:3Představuje například 8bitové celé číslo bez znaménka s faktorem měřítka 1/2 3 .
  • LabVIEW programovací jazyk používá notaci <s ,b ,m> specifikovat parametry jako ‚FXP‘ čísel pevných bodů. Složka s může být buď '+' nebo '±', což znamená buď nepodepsané číslo, nebo číslo doplněné znaménkem 2. Složka b je celkový počet bitů a m je počet bitů v celočíselné části.

Příklady softwarových aplikací

  • Populární formát písma TrueType používá v některých pokynech pro některé číselné hodnoty 32bitové podepsané binární pevné body s 26 bity nalevo od desetinné čárky. Tento formát byl zvolen tak, aby poskytoval minimální množství přesnosti požadované pro naznačování a z důvodů výkonu.
  • Všechny 3D grafické motory na původní PlayStation Sony , Sega Saturn , Nintendo's Game Boy Advance (pouze 2D ), Nintendo DS (2D a 3D), Nintendo Gamecube a GP2X Wiz videoherní systémy, kterým chyběla FPU, používaly aritmetiku s pevným bodem. PlayStation zahrnul do svého transformačního koprocesoru hardwarovou podporu 16bitového pevného bodu s 12 zlomky bitů.
  • TeX software sazba, široce používán vědců a matematiků, používá 32-bitovým binárním pevný bod s 16 frakcí bitů pro všechny výpočty pozic. Hodnoty jsou interpretovány jako zlomky bodu typografa . Metrické soubory písem TeX používají 32bitová čísla s pevným bodem se znaménkem a 12 zlomkovými bity.
  • Tremor , Toast a MAD jsou softwarové knihovny, které dekódují zvukové formáty Ogg Vorbis , GSM Full Rate a MP3 . Tyto kodeky používají aritmetiku s pevným bodem, protože mnoho hardwarových dekódovacích hardwarových zařízení nemá FPU.
  • The WavPack bezztrátový zvuk používá kompresor pevnou řádovou čárkou. Volba byla odůvodněna mimo jiné obavou, že různá pravidla zaokrouhlování s plovoucí desetinnou čárkou v různém hardwaru mohou poškodit bezeztrátovou povahu komprese.
  • Knihovna Nest Labs Utilities poskytuje omezenou sadu maker a funkcí pro čísla pevných bodů, zejména při práci s těmito čísly v kontextu vzorkování senzorů a výstupů senzorů.
  • Specifikace OpenGL ES 1.x obsahuje profil pevného bodu, protože jde o API zaměřené na vestavěné systémy, které nemají vždy FPU.
  • Programy dc a bc jsou libovolné přesné kalkulačky, ale sledují pouze (uživatelem specifikovaný) pevný počet zlomkových číslic.
  • Fractint představuje čísla jako čísla s pevným bodem Q2.29 , aby se zrychlilo kreslení na starých počítačích s procesory 386 nebo 486SX , kterým chyběl FPU.
  • Doom byl poslednímtitulem střílečky z pohledu první osoby od id Software, který u všech svých neceločíselných výpočtů, včetně mapového systému, geometrie, vykreslování, pohybu hráče atd., Používal 16,16 reprezentaci pevného bodu. moderní zdrojové porty Doom .
  • čísla pevných bodů se někdy používají pro ukládání a manipulaci s obrázky a video snímky. Procesory s jednotkami SIMD zaměřené na zpracování obrazu mohou obsahovat pokyny vhodné pro zpracování zabalených dat s pevným bodem.
  • Q # programovací jazyk pro Azure kvantových počítačů , které implementují kvantová logická hradla , obsahuje standardní numerickou knihovnu pro provedení s pevnou řádovou čárkou na registrech qubits .

Viz také

Reference

Další čtení

externí odkazy