Q (raqam formati) - Q (number format)

Q ikkilik sobit nuqta soni formati, bu erda soni kasrli bitlar (va ixtiyoriy ravishda soni tamsayı bit) ko'rsatilgan. Masalan, Q15 raqamida 15 ta qismli bit bor; Q1.14 raqamida 1 tamsayı bit va 14 qismli bit mavjud. Q format tez-tez suzuvchi nuqta birligi bo'lmagan apparatda va talab qilinadigan dasturlarda qo'llaniladi doimiy qaror.

Xususiyatlari

Q formatidagi raqamlar shartli ravishda belgilangan nuqta raqamlaridir, ya'ni ular odatdagi ikkilik imzolangan tamsayılar sifatida saqlanadi va ishlaydi, shu bilan standart tamsayı qo'shimcha /ALU ijro etish ratsional raqam hisob-kitoblar. Butun sonlarning bitlari, kasr bitlari va so'zning asosiy hajmini dasturchi dasturga mos ravishda tanlashi kerak - yuqoridagi dasturchining tanlovi raqamlar uchun zarur bo'lgan diapazon va qarorga bog'liq bo'ladi.

Ba'zi DSP arxitekturalari Q1.15 kabi keng tarqalgan formatlarni mahalliy qo'llab-quvvatlashni taklif qiladi. Bunday holda, protsessor arifmetikani taklif qilib, bir qadamda qo'llab-quvvatlashi mumkin to'yinganlik bitta buyruqda (qo'shish va ayirish uchun) va renormalizatsiya (ko'paytirish uchun). Ko'pgina standart protsessorlar bunday emas. Agar arxitektura to'g'ridan-to'g'ri tanlangan aniq nuqta formatini qo'llab-quvvatlamasa, dasturchi to'yinganlik va qayta normalizatsiya qilishni chegaralarni tekshirish va bitlarni almashtirish bilan aniq ishlashi kerak.

Belgilangan nuqta uchun ikkita qarama-qarshi yozuv mavjud. Ikkala yozuv ham Q shaklida yozilganm.n, qaerda:

  • Q bu raqamni Q formatidagi - the belgisida ekanligini belgilaydi Texas Instruments imzo qo'yilgan belgilangan raqamlar uchun vakillik ("Q" to'plami uchun standart belgini eslatadi ratsional sonlar ).
  • m. (ixtiyoriy, nol yoki bitta deb qabul qilingan) raqamning ikkitasini to'ldiruvchi tamsayı qismini belgilash uchun ajratilgan bitlar soni, eksklyuziv yoki belgi bitini o'z ichiga olgan (shuning uchun m belgilanmagan bo'lsa, u nol yoki bitta sifatida qabul qilinadi) .
  • n bu sonning kasr qismini belgilash uchun ishlatiladigan bitlar soni, ya'ni ikkilik nuqtadan o'ng tomonda joylashgan bitlar soni. (Agar n = 0 bo'lsa, Q sonlari butun sonlardir - degeneratsiya holati).

Bitta konventsiya qiymatidagi belgi bitini o'z ichiga oladi m,[1][2] va boshqa konventsiya yo'q. Anjumanni tanlashni yig'ish yo'li bilan aniqlash mumkin m + n. Agar qiymat registr o'lchamiga teng bo'lsa, u holda belgi biti qiymatiga kiritiladi m. Agar u registr kattaligidan bitta kichik bo'lsa, belgining biti qiymatiga kiritilmaydi m.

Bunga qo'shimcha ravishda, U harfi oldiga Q (UQ1.15) kabi imzo qo'yilmagan qiymatni ko'rsatish uchun 0,0 dan +1,999969482421875 gacha bo'lgan qiymatlarni (ya'ni, ).

Belgilangan Q qiymatlari saqlanadi ikkitasini to‘ldiruvchi format, xuddi ko'pgina protsessorlarda imzolangan tamsayı qiymatlari kabi. Ikkala qo'shimchada belgi biti registr kattaligiga kengaytiriladi.

Berilgan Q uchunm.n formatidan foydalaning m+n bitli tamsayıli konteyner bilan n qismli bitlar:

  • uning diapazoni
  • uning o'lchamlari

Berilgan UQ uchunm.n formatidan foydalaning m+n bilan bit imzosiz butun sonli konteyner n qismli bitlar:

  • uning diapazoni
  • uning o'lchamlari

Masalan, Q15.1 format raqami:

  • 15 + 1 = 16 bitni talab qiladi
  • uning diapazoni [-214, 214 - 2−1] = [-16384.0, +16383.5] = [0x8000, 0x8001… 0xFFFF, 0x0000, 0x0001… 0x7FFE, 0x7FFF]
  • uning o'lchamlari 2 ga teng−1 = 0.5

Aksincha suzuvchi nuqta raqamlar, Q raqamlarining o'lchamlari butun diapazonda doimiy bo'lib qoladi.

Konversiya

Q ga suzib o'ting

Raqamni suzuvchi nuqta Q gam.n format:

  1. Suzuvchi nuqta sonini 2 ga ko'paytiringn
  2. Butun songa qadar aylaning

Suzish uchun Q

Q dan raqamni aylantirish uchunm.n suzuvchi nuqtaga formatlash:

  1. Raqamni xuddi tamsayı kabi suzuvchi nuqtaga o'zgartiring, boshqacha qilib aytganda ikkilik nuqtani olib tashlang
  2. 2 ga ko'paytiringn

Matematik operatsiyalar

Q raqamlari - bu ikkita butun sonning nisbati: numerator omborda saqlanadi, maxraj 2 ga tengn.

Quyidagi misolni ko'rib chiqing:

  • Q8 maxraji 2 ga teng8 = 256
  • 1,5 384/256 ga teng
  • 384 saqlanadi, 256 xulosa qilinadi, chunki bu Q8 raqam.

Agar Q raqamining asosini saqlab qolish zarur bo'lsa (n doimiy bo'lib qoladi) Q sonli matematik operatsiyalar maxrajni doimiy ushlab turishi kerak. Quyidagi formulalar umumiy Q sonlari bo'yicha matematik operatsiyalarni ko'rsatadi va .

Ayiruvchi ikkitaning kuchi bo'lganligi sababli, ko'paytma sifatida bajarilishi mumkin arifmetik siljish chapga va bo'linish arifmetik siljish sifatida o'ngga; ko'plab protsessorlarda siljishlar ko'payish va bo'linishdan tezroq.

Aniqlikni saqlash uchun oraliq ko'paytirish va bo'linish natijalari ikki aniqlikda bo'lishi kerak va ularga e'tibor berish kerak yaxlitlash kerakli Q raqamiga qaytishdan oldin oraliq natija.

Foydalanish C operatsiyalar (e'tibor bering, bu erda $ Q $ qismli qism soniga ishora qiladi):

Qo'shish

int16_t q_add(int16_t a, int16_t b){    qaytish a + b;}

Doygunlik bilan

int16_t q_add_sat(int16_t a, int16_t b){    int16_t natija;    int32_t tmp;    tmp = (int32_t)a + (int32_t)b;    agar (tmp > 0x7FFF)        tmp = 0x7FFF;    agar (tmp < -1 * 0x8000)        tmp = -1 * 0x8000;    natija = (int16_t)tmp;    qaytish natija;}

Suzuvchi nuqta ± Infdan farqli o'laroq, to'yingan natijalar yopishqoq emas va musbat to'yingan qiymatga (0x7FFF) salbiy qiymat qo'shishda to'yinmaydi va aksincha ko'rsatilgan amalda. Assambleya tilida Signed Overflow bayrog'i ushbu C dasturini amalga oshirish uchun zarur bo'lgan matn translatsiyalaridan qochish uchun ishlatilishi mumkin.

Chiqarish

int16_t q_sub(int16_t a, int16_t b){    qaytish a - b;}

Ko'paytirish

// oldindan hisoblangan qiymat:# K ni aniqlang (1 << (Q - 1)) // int16_t oralig'iga to'yinganint16_t 16(int32_t x){	agar (x > 0x7FFF) qaytish 0x7FFF;	boshqa agar (x < -0x8000) qaytish -0x8000;	boshqa qaytish (int16_t)x;}int16_t q_mul(int16_t a, int16_t b){    int16_t natija;    int32_t temp;    temp = (int32_t)a * (int32_t)b; // natija turi operand tipidir    // yaxlitlash; o'rta qiymatlar yaxlitlanadi    temp += K;    // Asosiy va to'yingan natija bo'yicha bo'lish orqali to'g'rilash    natija = 16(temp >> Q);    qaytish natija;}

Bo'lim

int16_t q_div(int16_t a, int16_t b){    / * bazaga oldindan ko'paytiring (natija Q8 formatida bo'lishi uchun Q16 ga ko'taring) * /    int32_t temp = (int32_t)a << Q;    / * Yuvarlama: o'rta qiymatlar yaxlitlanadi (salbiy qiymatlar uchun pastga). * /    / * Yoki eng muhim bitlarni solishtiring, ya'ni (((temp >> 31) & 1) == ((b >> 15) & 1)) * /    agar ((temp >= 0 && b >= 0) || (temp < 0 && b < 0)) {           temp += b / 2;    / * Yoki 1 bit siljish, ya'ni temp + = (b >> 1); * /    } boshqa {        temp -= b / 2;    / * Yoki 1 bit siljish ya'ni temp - = (b >> 1); * /    }    qaytish (int16_t)(temp / b);}

Shuningdek qarang

Adabiyotlar

  1. ^ "ARM Developer Suite AXD va armud disk raskadrovka qo'llanmasi". 1.2. ARM Limited. 2001 yil [1999]. 4.7.9-bob. AXD> AXD imkoniyatlari> Ma'lumotlarni formatlash> Q format. ARM DUI 0066D. Arxivlandi asl nusxasidan 2017-11-04.
  2. ^ "4.7.9-bob. AXD> AXD imkoniyatlari> Ma'lumotlarni formatlash> Q-format". RealView Development Suite AXD va armud disk raskadrovka qo'llanmasi (PDF). 3.0. ARM Limited. 2006 yil [1999]. 4-24 betlar. ARM DUI 0066G. Arxivlandi (PDF) asl nusxasidan 2017-11-04.

Qo'shimcha o'qish

Tashqi havolalar