El escalado binario es una técnica de programación informática que se utiliza normalmente en programas C , DSP y ensamblador integrados para implementar operaciones que no son enteros mediante el uso de la aritmética de enteros nativa del procesador.
Descripción general
Una representación de un valor mediante escalado binario es más precisa que una representación de punto flotante que ocupa el mismo número de bits, pero normalmente representa valores de un rango más limitado, lo que conduce más fácilmente a un desbordamiento aritmético durante el cálculo. La implementación de operaciones usando instrucciones aritméticas enteras es a menudo (pero no siempre) más rápida que las correspondientes instrucciones de punto flotante.
Se elige una posición para el 'punto binario' para cada variable que se va a representar, y los cambios binarios asociados con las operaciones aritméticas se ajustan en consecuencia. La escala binaria corresponde en Q (formato numérico) al primer dígito, es decir, Q1.15 es un entero de 16 bits escalado con un bit como entero y quince como fraccionario. Un número de Bscal 1 o Q1.15 representaría aproximadamente 0.999 a -1.0.
Para dar un ejemplo, una forma común de usar aritmética de enteros para simular un punto flotante, usando números de 32 bits, es multiplicar los coeficientes por 65536.
Usando notación científica binaria , esto colocará el punto binario en B16. Es decir, los 16 bits más significativos representan la parte entera y el resto representa la parte fraccionaria. Esto significa que, como un número entero B16 en complemento a dos con signo, puede contener un valor más alto dey un valor más bajo de -32768.0. Dicho de otra manera, el número B es el número de bits enteros que se utilizan para representar el número que define su rango de valores. Los bits bajos restantes (es decir, los bits que no son enteros) se utilizan para almacenar cantidades fraccionarias y proporcionar más precisión.
Por ejemplo, para representar 1.2 y 5.6 como B16, uno los multiplica por 2 16 , dando 78643 y 367001 como los números enteros más cercanos.
Multiplicar estos juntos da
28862059643
Para volver a convertirlo en B16, divídelo entre 2 16 .
Esto da 440400B16, que cuando se convierte de nuevo a un número de punto flotante (dividiendo de nuevo por 2 16 , pero manteniendo el resultado como punto flotante) da 6,71997 aproximadamente. El resultado correcto es 6,72.
Cambio de escala después de la multiplicación
El ejemplo anterior para una multiplicación B16 es un ejemplo simplificado. El cambio de escala depende tanto del valor de la escala B como del tamaño de la palabra. B16 se utiliza a menudo en sistemas de 32 bits porque funciona simplemente multiplicando y dividiendo por 65536 (o desplazando 16 bits).
Considere el punto binario en una palabra de 32 bits con signo así:
0 1 2 3 4 5 6 7 8 9 SXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX
donde S es el bit de signo y X son los otros bits.
Colocando el punto binario en
- 0 da un rango de -1,0 a 0,999999.
- 1 da un rango de −2.0 a 1.999999
- 2 da un rango de -4.0 a 3.999999 y así sucesivamente.
Al usar diferentes escalas B y / o tamaños de palabras, se debe usar la fórmula de conversión de escala B completa.
Considere un tamaño de palabra de 32 bits y dos variables, una con una escala B de 2 y la otra con una escala de 4.
1.4 @ B2 es 1.4 * (2 ^ (tamaño de palabras-2-1)) == 1.4 * 2 ^ 29 == 0x2CCCCCCD
Tenga en cuenta que aquí los valores de 1.4 están muy bien representados con 30 bits de fracción. Un número de coma flotante de 32 bits tiene 23 bits para almacenar la fracción. Esta es la razón por la que la escala B es siempre más precisa que la coma flotante del mismo tamaño de palabra. Esto es especialmente útil en integradores o sumas repetidas de pequeñas cantidades donde el error de redondeo puede ser un problema sutil pero muy peligroso cuando se usa punto flotante.
Ahora un número mayor 15,2 en B4.
15.2 @ B4 es 15.2 * (2 ^ (wordize-4-1)) == 15.2 * 2 ^ 27 == 0x7999999A
El número de bits para almacenar la fracción es de 28 bits. Al multiplicar estos números de 32 bits se obtiene el resultado de 64 bits 0x1547AE14A51EB852
Este resultado está en B7 en una palabra de 64 bits. Desplazándolo hacia abajo en 32 bits da el resultado en B7 en 32 bits.
0x1547AE14
Para volver a convertir a punto flotante, divida esto por (2^(wordsize-7-1)) == 21.2800000099
Se pueden utilizar varias escalas. B0, por ejemplo, se puede utilizar para representar cualquier número entre -1 y 0,999999999.
Ángulos binarios
Los ángulos binarios se mapean usando B0, con 0 como 0 grados, 0,5 como 90 ° (o ), −1.0 o 0.9999999 como 180 ° (o π rad), y −0.5 como 270 ° (o). Cuando estos ángulos binarios se suman usando matemáticas normales en complemento a dos , la rotación de los ángulos es correcta, incluso cuando se cruza el límite del signo; esto convenientemente elimina las verificaciones de ángulos ≥ 360 ° cuando se manejan ángulos ordinarios [1] (los datos que permiten ángulos con más de una rotación deben usar alguna otra codificación).
Los términos medición angular binaria ( BAM ) [2] y sistema de medición angular binaria ( BAMS ) [3] , así como brads ( radianes binarios o grados binarios ) se refieren a implementaciones de ángulos binarios. Encuentran uso en robótica, navegación, [4] juegos de computadora, [5] y sensores digitales. [6]
No importa qué patrón de bits se almacene en un ángulo binario, cuando se multiplica por 180 ° (o π rad) usando aritmética estándar de punto fijo con signo , el resultado es siempre un ángulo válido en el rango de −180 grados ( −π radianes ) a +180 grados ( + π radianes). En algunos casos, es conveniente utilizar la multiplicación sin signo (en lugar de la multiplicación con signo) en un ángulo binario, lo que da el ángulo correcto en el rango de 0 a +360 grados ( + 2π radianes o +1 giro ). En comparación con el almacenamiento de ángulos en un formato de ángulo binario, el almacenamiento de ángulos en cualquier otro formato inevitablemente da como resultado algunos patrones de bits que dan "ángulos" fuera de ese rango, lo que requiere pasos adicionales para reducir el valor al rango deseado o dar como resultado algunos patrones de bits. que no son ángulos válidos en absoluto ( NaN ), o ambos.
Aplicación de técnicas de escalado binario
Las técnicas de escalado binario se utilizaron en las décadas de 1970 y 1980 para la computación en tiempo real que era matemáticamente intensiva, como la simulación de vuelo y los algoritmos de control de centrales nucleares desde finales de la década de 1960. El código a menudo se comentaba con las escalas binarias de los resultados intermedios de las ecuaciones.
El escalado binario todavía se usa en muchas aplicaciones DSP y los microprocesadores hechos a medida se basan generalmente en técnicas de escalado binario. La medición angular binaria se utiliza en los coprocesadores CORDIC integrados de la serie STM32G4 .
La escala binaria se usa actualmente en el DCT que se usa para comprimir imágenes JPEG en utilidades como GIMP .
Aunque el punto flotante se ha hecho cargo en gran medida, donde se requiere velocidad y precisión adicional, el escalado binario funciona en hardware más simple y es más preciso cuando el rango de valores se conoce de antemano y es suficientemente limitado. Esto se debe a que todos los bits en un entero binario escalado se usan para la precisión del valor (aunque puede haber ceros a la izquierda si el rango de valores es grande), mientras que en el punto flotante, algunos bits se usan para definir la escala.
Ver también
- Libfixmath : una biblioteca escrita en C para matemáticas de punto fijo
- Q (formato de número)
- Minifloat
- Escala de bloque flotante
- Operación de módulo
Referencias
- ^ Hargreaves, Shawn . "Ángulos, números enteros y módulo aritmético" . blogs.msdn.com. Archivado desde el original el 30 de junio de 2019 . Consultado el 5 de agosto de 2019 .
- ^ "Medición angular binaria" . Archivado desde el original el 21 de diciembre de 2009.
- ^ "Sistema de medición angular binaria" . acrónimos del diccionario libre .
- ^ LaPlante, Phillip A. (2004). "Capítulo 7.5.3, Medida angular binaria" . Diseño y análisis de sistemas en tiempo real . www.globalspec.com .
- ^ Sanglard, Fabien (13 de enero de 2010). "Revisión del código de Doom 1993 - Sección" Muros " " . fabiensanglard.net .
- ^ "Módulo de brújula Hitachi HM55B (# 29123)" (PDF) . www.hobbyengineering.com . Sensor de brújula digital Parallax (# 29123). Parallax, Inc. Mayo de 2005. Archivado desde el original (PDF) el 11 de julio de 2011, a través de www.parallax.com.