Q es un formato de número de punto fijo binario donde se especifica el número de bits fraccionarios (y opcionalmente el número de bits enteros ). Por ejemplo, un número Q15 tiene 15 bits fraccionarios; un número Q1.14 tiene 1 bit entero y 14 bits fraccionarios.
Para los números de coma fija firmados, hay dos usos contradictorios del formato Q. En un uso, el bit de signo se cuenta como un bit entero, pero en el segundo uso no lo es. Por ejemplo, un entero de 16 bits con signo podría denotarse como Q16.0 o Q15.0. Por lo tanto, es necesario especificar también el número total de bits (en este caso 16) para describir un número de coma fija con signo utilizando el formato Q.
El formato Q es una de las varias notaciones de formato de coma fija ampliamente utilizadas . Los números de punto fijo se utilizan a menudo en hardware que no tiene una unidad de punto flotante y en aplicaciones que requieren una resolución constante .
Caracteristicas
Los números de formato Q son números de punto fijo teóricamente, es decir, se almacenan y operan como enteros binarios con signo regular, lo que permite que el hardware de enteros estándar / ALU realice cálculos de números racionales . El programador debe elegir el número de bits enteros, bits fraccionarios y el tamaño de la palabra subyacente en función de la aplicación específica; las opciones anteriores del programador dependerán del rango y la resolución necesarios para los números.
Algunas arquitecturas DSP ofrecen soporte nativo para formatos comunes, como Q1.15. En este caso, el procesador puede admitir aritmética en un paso, ofreciendo saturación (para suma y resta) y renormalización (para multiplicación) en una sola instrucción. La mayoría de las CPU estándar no lo hacen. Si la arquitectura no admite directamente el formato de punto fijo particular elegido, el programador deberá manejar la saturación y la renormalización explícitamente con verificación de límites y desplazamiento de bits.
Hay dos notaciones en conflicto para el punto fijo. Ambas notaciones se escriben como Q m . n , donde:
- Q designa que el número está en la notación de formato Q, la representación de Texas Instruments para números de coma fija con signo (la "Q" recuerda al símbolo estándar para el conjunto de números racionales ).
- metro. (opcional, se supone que es cero o uno) es el número de bits reservados para designar la parte entera del número en complemento a dos, exclusivo o inclusivo del bit de signo (por lo tanto, si no se especifica m, se toma como cero o uno) .
- n es el número de bits que se utiliza para designar la parte fraccionaria del número, es decir, el número de bits a la derecha del punto binario. (Si n = 0, los números Q son números enteros, el caso degenerado).
Una convención incluye el bit de signo en el valor de m , [1] [2] y la otra convención no. La elección de la convención se puede determinar sumando m + n . Si el valor es igual al tamaño del registro, entonces el bit de signo se incluye en el valor de m . Si es uno menos que el tamaño del registro, el bit de signo no se incluye en el valor de m .
Además, la letra U se puede anteponer a la Q para indicar un valor sin signo, como UQ1.15, que indica valores de 0.0 a +1.999969482421875 (es decir, ).
Los valores de Q con signo se almacenan en formato de complemento a dos , al igual que los valores enteros con signo en la mayoría de los procesadores. En complemento a dos, el bit de signo se extiende al tamaño del registro.
Para un Q m dado . n , utilizando un contenedor de enteros con signo de m + n bits con n bits fraccionarios:
- su rango es
- su resolución es
Para un UQ m dado . n formato, usando un contenedor entero sin signo de m + n bits con n bits fraccionarios:
- su rango es
- su resolución es
Por ejemplo, un número de formato Q15.1:
- requiere 15 + 1 = 16 bits
- su rango es [-2 14 , 2 14 - 2 −1 ] = [-16384.0, +16383.5] = [0x8000, 0x8001… 0xFFFF, 0x0000, 0x0001… 0x7FFE, 0x7FFF]
- su resolución es 2 −1 = 0.5
A diferencia de los números de coma flotante , la resolución de los números Q permanecerá constante en todo el rango.
Conversión
Flotar a Q
Para convertir un número de coma flotante a Q m . n formato:
- Multiplica el número de coma flotante por 2 n
- Redondea al entero más cercano
Q flotar
Para convertir un número de Q m . n formato a punto flotante:
- Convierte el entero en flotante
- Multiplicar por 2 - n
Operaciones matemáticas
Los números Q son una razón de dos números enteros: el numerador se almacena, el denominador es igual a 2 n .
Considere el siguiente ejemplo:
- El denominador Q8 es igual a 2 8 = 256
- 1,5 es igual a 384/256
- 384 se almacena, 256 se infiere porque es un número Q8.
Si la base del número Q se va a mantener ( n permanece constante), las operaciones matemáticas del número Q deben mantener constante el denominador. Las siguientes fórmulas muestran operaciones matemáticas en los números Q generales y .
Debido a que el denominador es una potencia de dos, la multiplicación se puede implementar como un desplazamiento aritmético hacia la izquierda y la división como un desplazamiento aritmético hacia la derecha; en muchos procesadores, los cambios son más rápidos que la multiplicación y la división.
Para mantener la precisión, los resultados intermedios de multiplicación y división deben ser de doble precisión y se debe tener cuidado al redondear el resultado intermedio antes de volver a convertir al número Q deseado.
Usando C, las operaciones son (tenga en cuenta que aquí, Q se refiere al número de bits de la parte fraccionaria):
Adición
int16_t q_add ( int16_t a , int16_t b ) { return a + b ; }
Con saturación
int16_t q_add_sat ( int16_t a , int16_t b ) { int16_t resultado ; int32_t tmp ; tmp = ( int32_t ) a + ( int32_t ) b ; si ( tmp > 0x7FFF ) tmp = 0x7FFF ; si ( tmp < -1 * 0x8000 ) tmp = -1 * 0x8000 ; resultado = ( int16_t ) tmp ; devolver resultado ; }
A diferencia del punto flotante ± Inf, los resultados saturados no son pegajosos y se insaturarán al agregar un valor negativo a un valor saturado positivo (0x7FFF) y viceversa en la implementación que se muestra. En lenguaje ensamblador, el indicador de desbordamiento firmado se puede usar para evitar los encasillamientos necesarios para esa implementación de C.
Sustracción
int16_t q_sub ( int16_t a , int16_t b ) { return a - b ; }
Multiplicación
// valor precalculado: #define K (1 << (Q - 1)) // saturar al rango de int16_t int16_t sat16 ( int32_t x ) { if ( x > 0x7FFF ) return 0x7FFF ; de lo contrario, si ( x < -0x8000 ) devuelve -0x8000 ; si no devuelve ( int16_t ) x ; }int16_t q_mul ( int16_t a , int16_t b ) { int16_t resultado ; int32_t temp ; temp = ( int32_t ) a * ( int32_t ) b ; // el tipo de resultado es el tipo de operando // Redondeo; los valores medios se redondean hacia arriba temp + = K ; // Corregir dividiendo por base y saturar resultado result = sat16 ( temp >> Q ); devolver resultado ; }
División
int16_t q_div ( int16_t a , int16_t b ) { / * multiplicar previamente por la base (Escalar a Q16 para que el resultado esté en formato Q8) * / int32_t temp = ( int32_t ) a << Q ; / * Redondeo: los valores medios se redondean hacia arriba (hacia abajo para los valores negativos). * / / * O comparar los bits más significativos, es decir, si (((temp >> 31) & 1) == ((b >> 15) & 1)) * / if (( temp > = 0 && b > = 0 ) || ( temp < 0 && b < 0 )) { temp + = b / 2 ; / * O desplazar 1 bit, es decir temp + = (b >> 1); * / } else { temp - = b / 2 ; / * O desplazar 1 bit, es decir, temp - = (b >> 1); * / } return ( int16_t ) ( temp / b ); }
Ver también
Referencias
- ^ "Guía de depuradores de ARM Developer Suite AXD y armsd" . 1.2. ARM Limited . 2001 [1999]. Capítulo 4.7.9. AXD> AXD Facilidades> Formateo de datos> Q-formato. BRAZO DUI 0066D. Archivado desde el original el 4 de noviembre de 2017.
- ^ "Capítulo 4.7.9. AXD> AXD Facilidades> Formateo de datos> Formato Q". RealView Development Suite AXD and armsd Debuggers Guide (PDF) . 3.0. ARM Limited . 2006 [1999]. págs. 4-24. BRAZO DUI 0066G. Archivado (PDF) desde el original el 4 de noviembre de 2017.
Otras lecturas
- Oberstar, Erick L. (30 de agosto de 2007) [2004]. "Representación de punto fijo y matemática fraccionada" (PDF) . 1.2. Oberstar Consulting. Archivado (PDF) desde el original el 4 de noviembre de 2017 . Consultado el 4 de noviembre de 2017 . (Nota: la exactitud del artículo está en disputa; vea la discusión).
enlaces externos
- "Implementación de Java en formato Q-Number" . Archivado desde el original el 4 de noviembre de 2017 . Consultado el 4 de noviembre de 2017 .
- "Convertidor de formato Q" . Archivado desde el original el 25 de junio de 2021 . Consultado el 25 de junio de 2021 .