Q (číselný formát) - Q (number format)
tento článek potřebuje další citace pro ověření.Květen 2015) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Q je binární pevný bod formát čísla, kde počet zlomek bity (a volitelně počet celé číslo bitů). Například číslo Q15 má 15 zlomkových bitů; číslo Q1.14 má 1 celočíselný bit a 14 zlomkových bitů. Formát Q se často používá v hardwaru, který nemá jednotku s plovoucí desetinnou čárkou, a v aplikacích, které to vyžadují konstantní rozlišení.
Vlastnosti
Čísla formátu Q jsou teoreticky čísla s pevnými body, to znamená, že jsou uložena a provozována jako běžná binární podepsaná celá čísla, což umožňuje standardní celočíselný hardware /ALU vystupovat racionální číslo výpočty. Počet celočíselných bitů, zlomkové bity a velikost základního slova si programátor zvolí na základě konkrétní aplikace - programátorova volba výše uvedeného bude záviset na rozsahu a rozlišení potřebném pro čísla.
Některé architektury DSP nabízejí nativní podporu pro běžné formáty, například Q1.15. V takovém případě může procesor podporovat aritmetiku v jednom kroku a nabídnout nasycení (pro sčítání a odčítání) a renormalizace (pro násobení) v jedné instrukci. Většina standardních procesorů ne. Pokud architektura přímo nepodporuje zvolený konkrétní formát pevného bodu, programátor bude muset explicitně zpracovat saturaci a renormalizaci s kontrolou hranic a posunem bitů.
Existují dva protichůdné zápisy pro pevný bod. Obě notace jsou psány jako Qm.n, kde:
- Q označuje, že číslo je ve formátu Q - Texas Instruments reprezentace podepsaných čísel s pevnou řádovou čárkou (písmeno „Q“ připomíná standardní symbol pro množinu racionální čísla ).
- m. (nepovinné, předpokládá se, že je nula nebo jedna) je počet bitů vyčleněných k označení celé části komplementu dvou čísel, výlučné nebo včetně znakového bitu (proto pokud m není specifikováno, je bráno jako nula nebo jedna) .
- n je počet bitů použitých k označení zlomkové části čísla, tj. počet bitů napravo od binárního bodu. (Pokud n = 0, jsou čísla Q celá čísla - zdegenerovaný případ).
Jedna konvence obsahuje bit znaménka v hodnotě m,[1][2] a druhá konvence ne. Volbu konvence lze určit součtem m + n. Pokud je hodnota rovna velikosti registru, je bit znaménka zahrnut do hodnoty m. Pokud je o jednu menší než velikost registru, bit znaménka není zahrnut v hodnotě m.
Písmeno U lze navíc předponovat Q, aby označovalo nepodepsanou hodnotu, například UQ1.15, označující hodnoty od 0,0 do +1,999969482421875 (tj. ).
Podepsané hodnoty Q jsou uloženy v doplněk dvou formát, stejně jako celočíselné hodnoty se znaménkem na většině procesorů. V doplňku dvou je bit znaménka rozšířen na velikost registru.
Pro dané Qm.n formátu pomocí m+n bit podepsaný celočíselný kontejner s n zlomkové bity:
- jeho rozsah je
- jeho rozlišení je
Pro dané UQm.n formátu pomocí m+n bitový nepodepsaný celočíselný kontejner s n zlomkové bity:
- jeho rozsah je
- jeho rozlišení je
Například číslo formátu Q15.1:
- vyžaduje 15 + 1 = 16 bitů
- jeho rozsah je [-214, 214 - 2−1] = [-16384.0, +16383,5] = [0x8000, 0x8001… 0xFFFF, 0x0000, 0x0001… 0x7FFE, 0x7FFF]
- jeho rozlišení je 2−1 = 0.5
Na rozdíl od plovoucí bod čísel, rozlišení Q čísel zůstane konstantní v celém rozsahu.
Konverze
Plovoucí do Q
Chcete-li převést číslo z plovoucí bod do Qm.n formát:
- Vynásobte číslo s plovoucí desetinnou čárkou 2n
- Zaokrouhlit na nejbližší celé číslo
Q se vznáší
Chcete-li převést číslo z Qm.n formát na plovoucí desetinnou čárku:
- Převeďte číslo na plovoucí desetinnou čárku, jako by to bylo celé číslo, jinými slovy odstraňte binární bod
- Vynásobte 2−n
Matematické operace
Čísla Q jsou poměrem dvou celých čísel: čitatel je uložen v paměti, jmenovatel je roven 2n.
Zvažte následující příklad:
- Jmenovatel Q8 se rovná 28 = 256
- 1,5 se rovná 384/256
- 384 je uloženo, 256 je odvozeno, protože se jedná o číslo Q8.
Pokud má být zachována základna čísla Q (n zůstává konstantní) matematické operace s číslem Q musí udržovat jmenovatele konstantní. Následující vzorce ukazují matematické operace s obecnými čísly Q a .
Protože jmenovatel je mocninou dvou, lze násobení implementovat jako aritmetický posun doleva a dělení jako aritmetický posun doprava; na mnoha procesorech jsou posuny rychlejší než násobení a dělení.
Aby byla zachována přesnost, musí být mezilehlé výsledky násobení a dělení dvojnásobné přesnosti a je třeba věnovat pozornost zaokrouhlování mezivýsledek před převedením zpět na požadované číslo Q.
Použitím C operace jsou (všimněte si, že zde Q odkazuje na počet bitů zlomkové části):
Přidání
int16_t q_add(int16_t A, int16_t b){ vrátit se A + b;}
Se sytostí
int16_t q_add_sat(int16_t A, int16_t b){ int16_t výsledek; int32_t tmp; tmp = (int32_t)A + (int32_t)b; -li (tmp > 0x7FFF) tmp = 0x7FFF; -li (tmp < -1 * 0x8000) tmp = -1 * 0x8000; výsledek = (int16_t)tmp; vrátit se výsledek;}
Na rozdíl od plovoucí desetinné čárky ± Inf nejsou nasycené výsledky lepkavé a nenasycené při přidání záporné hodnoty k pozitivní nasycené hodnotě (0x7FFF) a naopak v zobrazené implementaci. V assembleru lze použít příznak podepsaného přetečení, aby se zabránilo Typecasts potřebným pro danou implementaci C.
Odčítání
int16_t q_sub(int16_t A, int16_t b){ vrátit se A - b;}
Násobení
// předpočítaná hodnota:#define K (1 << (Q - 1)) // saturate to range of int16_tint16_t sat16(int32_t X){ -li (X > 0x7FFF) vrátit se 0x7FFF; jiný -li (X < -0x8000) vrátit se -0x8000; jiný vrátit se (int16_t)X;}int16_t q_mul(int16_t A, int16_t b){ int16_t výsledek; int32_t tepl; tepl = (int32_t)A * (int32_t)b; // typ výsledku je typ operandu // Zaokrouhlování; střední hodnoty jsou zaokrouhleny nahoru tepl += K.; // Opravte vydělením základním a nasyceným výsledkem výsledek = sat16(tepl >> Q); vrátit se výsledek;}
Divize
int16_t q_div(int16_t A, int16_t b){ / * přednásobení základnou (Upscale to Q16 so that the result will be in Q8 format) * / int32_t tepl = (int32_t)A << Q; / * Zaokrouhlování: střední hodnoty jsou zaokrouhleny nahoru (dolů pro záporné hodnoty). * / / * NEBO porovnejte nejvýznamnější bity, tj. If (((temp >> 31) & 1) == ((b >> 15) & 1)) * / -li ((tepl >= 0 && b >= 0) || (tepl < 0 && b < 0)) { tepl += b / 2; / * NEBO posun o 1 bit, tj. Teplota + = (b >> 1); * / } jiný { tepl -= b / 2; / * NEBO posun o 1 bit, tj. Teplota - = (b >> 1); * / } vrátit se (int16_t)(tepl / b);}
Viz také
Reference
- ^ „ARM Developer Suite AXD and armsd Debuggers Guide“. 1.2. ARM Limited. 2001 [1999]. Kapitola 4.7.9. AXD> Zařízení AXD> Formátování dat> Q-formát. ARM DUI 0066D. Archivováno z původního dne 2017-11-04.
- ^ „Kapitola 4.7.9. AXD> Zařízení AXD> Formátování dat> Q-formát“. Průvodce debuggery RealView Development Suite AXD a zbraní (PDF). 3.0. ARM Limited. 2006 [1999]. s. 4–24. ARM DUI 0066G. Archivováno (PDF) z původního dne 2017-11-04.
Další čtení
- Oberstar, Erick L. (2007-08-30) [2004]. „Reprezentace pevného bodu a zlomková matematika“ (PDF). 1.2. Oberstar Consulting. Archivováno (PDF) z původního dne 2017-11-04. Citováno 2017-11-04. (Poznámka: přesnost článku je sporná; viz diskuse.)
externí odkazy
- „Implementace Java ve formátu Q-Number“. Archivováno z původního dne 2017-11-04. Citováno 2017-11-04.