- Q (number format)
Q is a fixed point number format where the number of fractional
bit s (and optionally the number ofinteger bits) is specified. For example, a Q15 number has 15 fractional bits; a Q1.14 number has 1 integer bit and 14 fractional bits. Q format is often used in hardware that does not have a floating-point unit and in applications that require constant resolution.Characteristics
Because Q format numbers are fixed point, they can be stored and operated on as integers. The number of fractional bits and the underlying integer size are chosen on an application-specific basis, depending on the range and resolution needed.
The notation used is Q"m"."n", where:
*Q designates that the number is in Q format notation — the Texas Instruments representation for signed fixed-point numbers.
*"m" (optional; default=0) is the number of bits used to designate the two's complement integer portion of the number, exclusive of the sign bit.
*"n" is the number of bits used to designate the two's complement fractional portion of the number, i.e. the number of bits to the right of the binary point.Note that the most significant bit is always designated as the sign bit (the number is stored as a
two's complement number). Representing a signed fixed-point data type in Q format therefore always requires "m"+"n"+1 bits to account for the sign.For a given Q"m"."n" format, using an "m"+"n"+1 bit signed integer container with "n" fractional bits:
* its range is [-2"m", 2"m" - 2-"n"]
* its resolution is 2-"n"For example, a Q14.1 format number:
* requires 14+1+1 = 16 bits
* its range is [-214, 214 - 2-1] = [-16384.0, +16383.5] = [0x8000, 0x8001 … 0xFFFF, 0x0000, 0x0001 … 0x7FFE, 0x7FFF]
* its resolution is 2-1 = 0.5Unlike
floating point , the resolution will remain constant over the entire range.Conversion
Float to Q
To convert a number from floating point to Q"m"."n" format:
# Multiply the floating point number by 2"n"
# Round to the nearest integerQ to Float
To convert a number from Q"m"."n" format to floating point:
# Convert the number directly to floating point
# Divide by 2"n"Math operations
Q numbers are a ratio of two integers, the numerator is kept in storage, the denominator is equal to 2"n".
Consider the following example:
The Q8 denominator equals 28 = 256
1.5 equals 384/256
384 is stored, 256 is inferred because it is a Q8 number.
If the Q numbers base is to be maintained ("n" remains constant) the Q number math operations must keep the denominator constant.
::::
Because the denominator is a power of two the multiplication can be implemented as an
arithmetic shift to the left and the division as an arithmetic shift to the right; on many processors shifts are faster than multiplication and division.To maintain accuracy the intermediate multiplication and division results must be double precision and care must be taken in
rounding the intermediate result before converting back to the desired Q number.Using C the operations are (note that here, Q refers to the fractional part's number of bits) :
Addition
signed int a,b,result; result = a+b;
ubtraction
signed int a,b,result; result = a-b;
Multiplication
signed int a,b,result,K; signed long int temp; temp = (long int) a * (long int) b; // result type is operand's type // Rounding; mid values are rounded up K = 1 << (Q-1); // 2**(Q-1) temp = temp + K; // Correct by dividing by base result= temp >> Q;
Division
signed int a,b,result; signed long int temp; // pre-multiply by the base temp = a<
ee also
*
Binary scaling
*fixed-point arithmetic
*floating point External links
* [http://www.superkits.net/whitepapers/Fixed%20Point%20Representation%20&%20Fractional%20Math.pdf Fixed Point Representation And Fractional Math] (Note: the accuracy of the article is in dispute; see discussion.)
Wikimedia Foundation. 2010.