Escala binaria - Binary scaling

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 instrucciones de punto flotante correspondientes.

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, el resto representa la parte fraccionaria. Esto significa que, como complemento a dos con signo, el número entero B16 puede contener un valor más alto y 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
 S X X X X X X X   X X X X X X X X   X X X X X X X X   X X X X X X X X

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 is 1.4 * (2 ^ (wordsize-2-1)) == 1.4 * 2 ^ 29 == 0x2CCCCCCD

Tenga en cuenta que aquí los valores 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 is 15.2 * (2 ^ (wordsize-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

Representación de ángulos en escala binaria (B0). El negro es la representación de grados tradicional, el verde es BAM como número decimal y el rojo es la representación hexadecimal de 32 bits del BAM.

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 (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 ) y sistema de medición angular binaria ( BAMS ), así como brads ( radianes binarios o grados binarios ) se refieren a implementaciones de ángulos binarios. Encuentran uso en robótica, navegación, juegos de computadora y sensores digitales.

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 en 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 de 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 apoderado 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

Referencias