Q(숫자 형식)

Q (number format)

Q 표기법은 이항 고정 소수점 번호 형식의 매개변수를 지정하는 간결한 방법입니다.다른 많은 표기가 같은 목적으로 사용되었습니다.

정의.

Texas Instruments 버전

Texas [citation needed]Instruments에서 정의한 Q 표기법은 다음과 같은 문자로 구성됩니다.Q에 이어 한 의 숫자 m.n. 여기서 m은 값의 정수 부분에 사용되는 비트 수, n은 분수 비트 수입니다.

기본적으로 이 표기법은 부호화된 이진 고정점 형식을 나타내며, 스케일링되지 않은 정수는 대부분의 이진 프로세서에서 사용되는 2개의 보완 형식으로 저장됩니다.첫 번째 비트는 항상 값 기호(1 = 음, 0 = 비음)를 제공하며 m 파라미터에는 카운트되지 않습니다.따라서 사용되는 비트의 총 w 는 1 + m + n 입니다.

예를 들어, 사양 Q3.12는 부호 비트, 정수 부분의 3비트 및 분수로 가정되는 12비트로 구성된 w = 16비트의 부호화된 이진 고정 소수점 숫자를 기술합니다.즉, 16비트 부호(2's complement) 정수로 스케일링−12 팩터2를 암묵적으로 곱한 것입니다.

특히 n이 0이면 숫자는 정수일 뿐입니다.m이 0인 경우 부호 비트를 제외한 모든 비트는 분수 비트입니다.저장된 숫자의 범위는 -1.0(포함) ~ +1(포함)입니다.m과 n은 모두 음수일 수 있습니다.

m과 점은 생략할 수 있습니다.이 경우 값이 저장되는 변수 또는 레지스터의 크기에서 유추됩니다.따라서 Q12는 임의의 수의 비트를 가진 부호 있는 정수를 의미하며, 이는 암묵적으로 2를−12 곱한 것입니다.

부호 없는 이진 고정 소수점 형식을 나타내기 위해 문자 U를 Q 앞에 붙일 수 있습니다.를 들어, UQ1.15에서는 0.0 ~ (2-116)/215 = +1.999969482421875 범위의 암묵적 스케일링 팩터가 2인−15 부호 없는 16비트 정수로 표현되는 값을 설명합니다.

AMD 버전

Q 표기법의 변형은 AMD에서 사용되고 있습니다.이 변형에서는 m 번호에 부호 비트가 포함됩니다.예를 들어, 16비트 부호 있는 정수는Q15.0TI 바리안트에서는Q16.0AMD [1][2]변종에서는요.

특성.

Qm.n 또는 UQm.n 형식의 분해능(연속값의 차이)은 항상n 2입니다.표시 가능한 값의 범위는 사용되는 표기법에 따라 달라집니다.

Q 표기법에서의 표시 가능한 값의 범위
표기법 텍사스 인스트루먼트 표기법 AMD 표기법
서명필 QM.n -2m ~ +2mn - 2 -2m−1 ~ +2m−1n - 2
서명되지 않은 UQm.n 0mn ~ 2 - 2 0mn ~ 2 - 2

예를 들어 Q15.1 형식 번호에는 15+1 = 16비트가 필요하며 분해능−1 2 = 0.5이며 표시 가능한 값의 범위는 -214 = -16384.0 ~ +214−1 - 2 = +16383.5입니다.16진수에서는 음의 값의 범위는 0x8000 ~0xFFF이며 음이 아닌 값의 범위는 0x0000 ~0x7FFF입니다

연산

Q 숫자는 2개의 정수의 비율입니다.분자는 스토리지에 보관되고 dd는 2와 같습니다n.

다음 예를 생각해 보겠습니다.

  • Q8 분모는 2 = 256입니다8.
  • 1.5는 384/256과 같다
  • 384가 저장되고 256은 Q8 번호이기 때문에 유추됩니다.

Q 숫자의 베이스가 일정하게 유지되는 경우(n은 일정하게 유지됨) Q 숫자 연산에서는 d d 일정하게 유지해야 합니다.다음 공식은 일반 Q 에 대한 산술 연산을 보여 줍니다(위의 예와 이고 d d 256).

분모는 2의 거듭제곱이기 때문에 곱셈은 왼쪽, 나눗셈은 오른쪽의 산술 시프트로 구현할 수 있습니다.많은 프로세서 시프트는 곱셈이나 나눗셈보다 빠릅니다.

정확도를 유지하려면 중간 곱셈 및 나눗셈 결과가 2배 정밀해야 하며 원하는 Q 수치로 다시 변환하기 전에 중간 결과를 반올림할 때 주의해야 합니다.

C를 사용하면 연산은 다음과 같습니다(여기서 Q는 분수 부품의 비트 수를 나타냅니다).

추가

int16_t 추가(int16_t a, int16_t b) {     돌아가다 a + b; } 

포화 상태

int16_t q_add_sat(int16_t a, int16_t b) {     int16_t 결과;     int32_t tmp;      tmp = (int32_t)a + (int32_t)b;     한다면 (tmp > 0x7FFF)         tmp = 0x7FFF;     한다면 (tmp < > -1 * 0x8000)         tmp = -1 * 0x8000;     결과 = (int16_t)tmp;      돌아가다 결과; } 

부동소수점 ±Inf와 달리 포화결과는 스틱하지 않으며 표시된 구현에서 음의 포화값(0x7FF)에 음의 값을 더하면 포화되지 않습니다.어셈블리 언어에서는 서명된 오버플로 플래그를 사용하여 C 구현에 필요한 타입캐스트를 회피할 수 있습니다.

뺄셈

int16_t q_sub(int16_t a, int16_t b) {     돌아가다 a - b; } 

곱셈

// 사전 계산된 값: #정의 K (1 < (Q - 1))   // int16_t 범위까지 포화 int16_t sat16(int32_t x) {  한다면 (x > 0x7FFF) 돌아가다 0x7FFF;  또 다른 한다면 (x < > - 0x8000) 돌아가다 - 0x8000;  또 다른 돌아가다 (int16_t)x; }  int16_t q_mul(int16_t a, int16_t b) {     int16_t 결과;     int32_t 임시직;      임시직 = (int32_t)a * (int32_t)b; // 결과 유형은 오퍼랜드의 유형입니다.     // 반올림, 중간값 반올림     임시직 += K;     // base와 satfaturate 결과로 나누어 수정     결과 = sat16(임시직 >> Q);      돌아가다 결과; } 

나누기

int16_t q_div(int16_t a, int16_t b) {     /* 베이스에 의해 프리 멀티플라이(Q16으로 업그레이드하여 결과가 Q8 형식으로 표시됨)*/     int32_t 임시직 = (int32_t)a << > Q;     /* 반올림: 중간 값은 반올림됩니다(음수 값은 내림).*/     /* 또는 대부분의 유효 비트를 비교합니다.예를 들어 ((((b > 31) & 1) == ((b > 15) & 1) */     한다면 ((임시직 >= 0 & & b >= 0)    (임시직 < > 0 & & b < > 0)) {            임시직 += b / 2;    /* 또는 1비트(예: temp += (b >> 1); */     } 또 다른 {         임시직 -= b / 2;    /* 또는 1비트 시프트(temp -= (b >> 1); */     }     돌아가다 (int16_t)(임시직 / b); } 

「 」를 참조해 주세요.

레퍼런스

  1. ^ "ARM Developer Suite AXD and armsd Debuggers Guide". 1.2. ARM Limited. 2001 [1999]. Chapter 4.7.9. AXD > AXD Facilities > Data formatting > Q-format. ARM DUI 0066D. Archived from the original on 2017-11-04.
  2. ^ "Chapter 4.7.9. AXD > AXD Facilities > Data formatting > Q-format". RealView Development Suite AXD and armsd Debuggers Guide (PDF). 3.0. ARM Limited. 2006 [1999]. pp. 4–24. ARM DUI 0066G. Archived (PDF) from the original on 2017-11-04.

추가 정보

  • Oberstar, Erick L. (2007-08-30) [2004]. "Fixed Point Representation & Fractional Math" (PDF). 1.2. Oberstar Consulting. Archived (PDF) from the original on 2017-11-04. Retrieved 2017-11-04. (주의: 문서의 정확성에 대해서는 논란이 있습니다.토론을 참조해 주세요).

외부 링크