Escala binária - Binary scaling

A escala binária é uma técnica de programação de computador usada normalmente em programas C , DSP e assembler incorporados para implementar operações não inteiras usando a aritmética de inteiros nativos do processador.

Visão geral

Uma representação de um valor usando escala binária é mais precisa do que uma representação de ponto flutuante ocupando o mesmo número de bits, mas normalmente representa valores de uma faixa mais limitada, portanto, levando mais facilmente a um estouro aritmético durante a computação. A implementação de operações usando instruções aritméticas de inteiros é freqüentemente (mas nem sempre) mais rápida do que as instruções de ponto flutuante correspondentes.

Uma posição para o 'ponto binário' é escolhida para cada variável a ser representada, e os deslocamentos binários associados às operações aritméticas são ajustados de acordo. A escala binária corresponde em Q (formato de número) ao primeiro dígito, ou seja, Q1.15 é um inteiro de 16 bits escalado com um bit como inteiro e quinze como fracionário. Um número Bscal 1 ou Q1.15 representaria aproximadamente 0,999 a -1,0.

Para dar um exemplo, uma maneira comum de usar aritmética de inteiros para simular o ponto flutuante, usando números de 32 bits, é multiplicar os coeficientes por 65536.

Usando a notação científica binária , isso colocará o ponto binário em B16. Ou seja, os 16 bits mais significativos representam a parte inteira e os restantes representam a parte fracionária. Isso significa que, como um número inteiro de complemento de dois com sinal, o número B16 pode conter um valor mais alto e um valor mais baixo de -32768,0. Dito de outra forma, o número B é o número de bits inteiros usados ​​para representar o número que define sua faixa de valores. Os bits baixos restantes (ou seja, os bits não inteiros) são usados ​​para armazenar quantidades fracionárias e fornecer mais precisão.

Por exemplo, para representar 1,2 e 5,6 como B16, multiplica-se por 2 16 , resultando em 78.643 e 367001 como os inteiros mais próximos.

Multiplicando estes juntos dá

28862059643

Para convertê-lo de volta para B16, divida por 2 16 .

Isso dá 440400B16, que quando convertido de volta para um número de ponto flutuante (dividindo novamente por 2 16 , mas mantendo o resultado como ponto flutuante) dá 6,71997 aproximadamente. O resultado correto é 6,72.

Reescalonamento após multiplicação

O exemplo acima para uma multiplicação B16 é um exemplo simplificado. O redimensionamento depende do valor da escala B e do tamanho da palavra. B16 é freqüentemente usado em sistemas de 32 bits porque funciona simplesmente multiplicando e dividindo por 65536 (ou deslocando 16 bits).

Considere o ponto binário em uma palavra de 32 bits com sinal, assim:

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

onde S é o bit de sinal e X são os outros bits.

Colocando o ponto binário em

  • 0 fornece um intervalo de -1,0 a 0,999999.
  • 1 fornece um intervalo de -2,0 a 1,999999
  • 2 fornece um intervalo de -4,0 a 3,999999 e assim por diante.

Ao usar escalas B e / ou tamanhos de palavras diferentes, a fórmula de conversão da escala B completa deve ser usada.

Considere um tamanho de palavra de 32 bits e duas variáveis, uma com escala B de 2 e a outra com escala 4.

1.4 @ B2 is 1.4 * (2 ^ (wordsize-2-1)) == 1.4 * 2 ^ 29 == 0x2CCCCCCD

Observe que aqui os valores de 1,4 são muito bem representados com 30 bits de fração. Um número de ponto flutuante de 32 bits tem 23 bits para armazenar a fração. É por isso que a escala B é sempre mais precisa do que o ponto flutuante do mesmo tamanho de palavra. Isso é especialmente útil em integradores ou soma repetida de pequenas quantidades onde o erro de arredondamento pode ser um problema sutil, mas muito perigoso ao usar o ponto flutuante.

Agora, um número maior, 15,2 em B4.

15.2 @ B4 is 15.2 * (2 ^ (wordsize-4-1)) == 15.2 * 2 ^ 27 == 0x7999999A

O número de bits para armazenar a fração é de 28 bits. Multiplicar esses números de 32 bits dá o resultado de 64 bits 0x1547AE14A51EB852

Este resultado está em B7 em uma palavra de 64 bits. Deslocando-o para baixo em 32 bits, o resultado é B7 em 32 bits.

0x1547AE14

Para converter de volta para ponto flutuante, divida por (2^(wordsize-7-1)) == 21.2800000099

Várias escalas podem ser usadas. B0, por exemplo, pode ser usado para representar qualquer número entre -1 e 0,999999999.

Ângulos binários

Representação em escala binária (B0) de ângulos. O preto é a representação tradicional em graus, o verde é BAM como um número decimal e o vermelho é a representação hexadecimal de 32 bits do BAM.

Os ângulos binários são mapeados usando B0, com 0 como 0 graus, 0,5 como 90 ° (ou ), -1,0 ou 0,9999999 como 180 ° (ou π rad) e -0,5 como 270 ° (ou ). Quando esses ângulos binários são adicionados usando a matemática do complemento normal de dois , a rotação dos ângulos está correta, mesmo ao cruzar a fronteira do sinal; isso convenientemente elimina as verificações de ângulos ≥ 360 ° ao lidar com ângulos comuns (dados que permitem ângulos com mais de uma rotação devem usar alguma outra codificação).

Os termos medição angular binária ( BAM ) e sistema de medição angular binário ( BAMS ), bem como brads ( radianos binários ou grau binário ), referem-se a implementações de ângulos binários. Eles encontram uso em robótica, navegação, jogos de computador e sensores digitais.

Não importa qual padrão de bits é armazenado em um ângulo binário, quando ele é multiplicado por 180 ° (ou π rad) usando aritmética de ponto fixo com sinal padrão , o resultado é sempre um ângulo válido na faixa de -180  graus ( −π  radianos ) a +180 graus ( + π  radianos). Em alguns casos, é conveniente usar a multiplicação sem sinal (em vez da multiplicação com sinal) em um ângulo binário, o que dá o ângulo correto na faixa de 0 a +360 graus ( + 2π  radianos ou +1 volta ). Em comparação com o armazenamento de ângulos em um formato de ângulo binário, o armazenamento de ângulos em qualquer outro formato resulta inevitavelmente em alguns padrões de bits que fornecem "ângulos" fora dessa faixa, exigindo etapas extras para reduzir o valor para a faixa desejada ou resulta em alguns padrões de bits que não são ângulos válidos ( NaN ), ou ambos.

Aplicação de técnicas de escalonamento binário

Técnicas de escalonamento binário foram usadas nas décadas de 1970 e 1980 para computação em tempo real que era matematicamente intensiva, como simulação de vôo e algoritmos de controle de usinas nucleares desde o final dos anos 1960. O código era frequentemente comentado com as escalas binárias dos resultados intermediários das equações.

A escala binária ainda é usada em muitos aplicativos DSP e os microprocessadores personalizados são geralmente baseados em técnicas de escala binária. A medição angular binária é usada na série STM32G4 incorporada em coprocessadores CORDIC .

A escala binária é usada atualmente no DCT para compactar imagens JPEG em utilitários como o GIMP .

Embora o ponto flutuante tenha assumido um grande grau, onde velocidade e precisão extra são necessárias, a escala binária funciona em hardware mais simples e é mais precisa quando a faixa de valores é conhecida com antecedência e é suficientemente limitada. Isso ocorre porque todos os bits em um inteiro escalado binário são usados ​​para a precisão do valor (embora possa haver zeros à esquerda se o intervalo de valores for grande), enquanto no ponto flutuante, alguns bits são usados ​​para definir a escala.

Veja também

Referências