El escalado binario es una técnica de programación de ordenadores incluida habitualmente en distintos lenguajes de bajo nivel como C, DSP o ensamblador, que permite manejar eficientemente pseudo operaciones con números de coma flotante utilizando la aritmética entera nativa del procesador.

Visión general editar

Una representación de un valor de coma flotante utilizando una escala binaria es más precisa que una representación de punto flotante que ocupa el mismo número de bits, pero generalmente representa valores de un rango más limitado, por lo que puede llevar más fácilmente a un desbordamiento aritmético durante el cálculo. La implementación de operaciones utilizando instrucciones aritméticas de enteros es a menudo (pero no siempre) más rápida que las instrucciones de coma flotante correspondientes.

El procedimiento está basado en elegir una posición del 'punto binario' para cada tipo de variable a ser representada, y se ajustan en consecuencia los cambios binarios asociados con las operaciones aritméticas. Por ejemplo, la escala binaria correspondiente 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 bits como parte fraccionaria. Un número "Bscal 1" (escala binaria 1) o Q1.15 representaría de forma aproximada los números del 1.999 a -2.000 como números con coma flotante y tres decimales de precisión.

Para dar un ejemplo, una forma común de usar la aritmética de enteros para simular la coma flotante, utilizando números de 32 bits, es multiplicar los coeficientes por 65536 (2 elevado a la 16).

Usando la notación científica binaria, el punto binario se colocará en B16. Esto quiere decir que los 16 bits significativos representan la parte entera, y el resto son la parte fraccionaria, lo que se traduce en que un número entero B16 de complemento a dos con signo, puede contener un valor máximo de   y un valor mínimo de  . Dicho de otra manera, el número B, es el número de bits enteros utilizados para representar el número que define su intervalo de valores. Los bits bajos restantes (es decir, los bits no enteros) se utilizan para almacenar cantidades fraccionarias y proporcionar una mayor precisión.

Por ejemplo, para representar 1.2 y 5.6 como B16, se multiplican por 216, obteniéndose los enteros 78643 y 367001.

Multiplicando estos dos números entre sí, el resultado es

 28862059643 

Para convertirlo de nuevo a B16, se divide de nuevo por 216.

Esto da 440400B16, que cuando se convierte de nuevo a un número de punto flotante (al dividir nuevamente por 216, pero manteniendo el resultado en coma flotante), da 6.71999. El resultado de punto flotante correcto es 6.72.

Reescalado después de la multiplicación editar

El ejemplo anterior para una multiplicación en B16 es un ejemplo simplificado. La nueva escala depende tanto del valor de la escala B como del tamaño de los datos manejados. B16 se usa a menudo en sistemas de 32 bits porque funciona de forma muy sencilla para multiplicar y dividir por 65536 (lo que se consigue desplazando las cifras 16 bits arriba o abajo).

Considérese el Punto Binario en un dato con signo de 32 bits, de forma que:

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 del signo y X son los otros bits.

Colocando el punto binario en

  • 0 da un intervalo de −1.0 a 0.999999.
  • 1 da un intervalo de −2.0 a 1.999999
  • 2 da un intervalo de −4.0 a 3.999999 y así sucesivamente.

Cuando se utilizan diferentes escalas B y/o tamaños de datos, se debe utilizar la fórmula de conversión de escala B completa.

Considerése 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 la palabra-2-1)) == 1.4 * 2 ^ 29 == 0x2CCCCCCD 

Téngase en cuenta que aquí los valores 1.4 están muy bien representados con 30 bits para la parte fraccionaria. Un número de coma flotante de 32 bits dispone de 23 bits para almacenar la parte fraccional. Esta es la razón por la cual la escala B es siempre más precisa que el punto flotante del mismo tamaño de palabra. Esto es especialmente útil en integradores o en la suma repetida de pequeñas cantidades, donde el error de redondeo puede ser un problema sutil pero muy peligroso cuando se usa un punto flotante.

Ahora con un número mayor como 15.2 en B4, se tiene que

15.2 @ B4 es 15.2 * (2 ^ (tamaño de palabra-4-1)) == 15.2 * 2 ^ 27 == 0x7999999A 

El número de bits para almacenar la parte fraccionaria es de 28 bits. Al multiplicar estos números de 32 bits se obtiene el resultado de 64 bits. 0x1547AE14A51EB852

Este resultado está en formato B7 en una palabra de 64 bits. Al desplazarlo hacia abajo 32 bits, se obtiene el resultado en B7 de 32 bits.

0x1547AE14 

Para convertir de nuevo a punto flotante, se debe dividir por (2^(wordsize-7-1)) == 21.2800000099

Se pueden usar varios escalones. B0, por ejemplo, puede usarse para representar cualquier número entre -1 y 0.999999999.

Ángulos binarios editar

 
Escalado binario (B0) para la representación de ángulos. El negro es la representación en grados tradicionales, el verde es una representación en coma flotante y el rojo es una representación hexadecimal de 32 bits

Los ángulos binarios se representan usando B0, con 0 como 0 grados, 0.5 como 90° (o  ), −1.0 o 0.9999999 como 180° (o π) y −0.5 como 270° (o  ). Cuando estos ángulos binarios se suman utilizando el complemento a dos, la rotación de los ángulos es correcta, incluso cuando se supera el límite de 2π (esto tiene la ventaja de que se elimina automáticamente la necesidad de verificar si se han generado ángulos ≥ 360°, como cuando se manejan grados de la forma habitual).[1]

Los términos medida angular binaria (abreviado como BAM en inglés)[2]​ y sistema de medición angular binario (BAMS),[3]​ así como brads (radianes binarios o grados binarios) se refieren a implementaciones de ángulos binarios. Encuentran su uso en robótica, navegación,[4]​ juegos de ordenador[5]​ y sensores digitales.[6]

No importa qué patrón de bits se almacene en un ángulo binario, cuando se multiplica por 180° (o π) utilizando aritmética de coma fija con signo estándar, el resultado es siempre un ángulo válido en el intervalo de −180° grados (−π radianes) a +180 grados (+π radianes). En algunos casos, es conveniente usar la multiplicación sin signo (en lugar de la multiplicación con signo) en las operaciones con ángulos binarios, lo que proporciona el ángulo correcto en el intervalo de 0 a +360 grados (+2π radianes o +1 vuelta). 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 que algunos patrones de bits puedan devolber ángulos fuera de ese rango, lo que requiere pasos adicionales para reducir el valor al intervalo deseado, o que dan lugar a algunos patrones de bits que no son ángulos válidos en absoluto (NaN), o incluso que se den ambos supuestos simultáneamente.

Aplicación de las técnicas de escalado binario editar

Las técnicas de escalado binario se utilizaron en las décadas de 1970 y 1980 para la computación en tiempo real matemáticamente intensiva, como en las taeas de simulación de vuelo y en los algoritmos de control de centrales nucleares desde finales de la década de 1960. El código de estas aplicaciones a menudo incluía comentarios indicando los escalados binarios utilizados para menejar los resultados intermedios de las ecuaciones.

El escalado binario todavía se utiliza en muchas aplicaciones de procesamiento digital de señales y los microprocesadores personalizados se basan generalmente en técnicas de escalado binario.

También se sigue usando en la transformación de coseno discreta utilizada para comprimir imágenes JPEG en utilidades como GIMP.

Aunque la mejora de la potencia de cálculo de los ordenadores ha hecho que el uso de operaciones con coma flotante se haya extendido en gran medida, donde se requiere velocidad y precisión adicionales, la escala binaria funciona de forma más simple y es más precisa cuando se conoce el intervalo de valores de antemano.  

Véase también editar

Referencias editar

  1. Angles, integers, and modulo arithmetic Shawn Hargreaves, blogs.msdn.com
  2. «Binary angular measurement». Archivado desde el original el 21 de diciembre de 2009. 
  3. «Binary Angular Measurement System». acronyms.thefreedictionary. 
  4. Real-Time Systems Design and Analysis Chapter 7.5.3, Binary Angular Measure, Phillip A. LaPlante, page via www.globalspec.com
  5. Doom 1993 code review Fabien Sanglard, section "Walls", 13/1/2010, fabiensanglard.net
  6. Hitachi HM55B Compass Module (#29123) Archivado el 11 de julio de 2011 en Wayback Machine. pdf via www.parallax.com via www.hobbyengineering.com