Ponto fixo (Fixed point)

Valores contendo uma porção inteira e uma fracionária. Antecessor da vírgula flutuante e ainda utilizado para realizar cálculos envolvendo fração.

Categoria de Tecnologia

Postado em 23 abril 2023

Atualizado em 23 abril 2023

Palavras-chave: point,virgula,comma,fixed,fixo,fp,flutuante,fracao,valor,math,matematica,calculo,aritmetica

Visualizações: 907



O ponto flutuante começou a ser utilizado em computadores residenciais com o intuito de dar mais flexibilidade e precisão para aplicativos que exigiam cada vez mais desempenho da máquina. A partir de então, a unidade responsável por todas as tarefas envolvendo ponto flutuante passou a ser integrada ao processador de cada vez mais computadores, possibilitando a execução de softwares que exigem cálculos com números fracionados com precisão. Hoje em dia é difícil encontrar um computador que não tenha um FPU (Unidade de ponto flutuante) embutida no seu processador.

Porém, o ponto flutuante pode ser custoso para alguns dispositivos que não exigem tanta complexidade. Por isso, alguns dispositivos optam por não utilizar o FPU. Essa decisão pode trazer benefícios como:

  • Menos consumo de energia (mais tempo de vida útil)
  • Menos custo de memória
  • Dispensa de recursos extras, como circuitos complexos para operações aritméticas e espaços dentro do chip dedicados ao ponto flutuante

Sistemas embarcados, alguns jogos de videogame e dispositivos de áudio (DSP - Digital signal processor) dispensam o ponto flutuante. Mesmo assim, esses dispositivos ainda podem expressar números contendo uma porção fracionária usando o ponto fixo.

O que é o ponto fixo?

O ponto fixo pode ser considerado o antônimo do ponto flutuante. Em inglês, é chamado de “fixed point”. Como o próprio nome diz, o ponto fixo não pode ser deslocado após a sua localização ser definida. Em outras palavras, o ponto fixo que separa a parte inteira e a parte fracionário de um valor, não pode ser deslocado posteriormente. Isso acontece pelo fato da parte inteira e fracionária serem calculados de forma separada.
7,5 7,5

O número acima possui duas partes:

  • Parte inteira : 7
  • Parte fracionária : 0,5

Toda máquina opera usando o sistema de numeração binário. Por isso, o número acima deve ser convertido para a numeração binária. Porém, antes de converter para a numeração binária é necessário especificar onde o ponto fixo vai ser colocado. Para especificar a localização do ponto fixo usa-se a notação Q.

O que é a notação Q?

A notação Q ou formato Q é usado para expressar o formato de um valor com ponto fixo. Por exemplo, se tivéssemos 4bits, poderíamos armazenar 4 dígitos binários (242^4), isso permitiria que armazenássemos um valor decimal de 0 até 15. Porém, se tivermos um valor fracionário precisaríamos de alguns dos 4bits para representar a parte fracionária do valor. No caso do 7,5 precisaríamos de 3 bits para representar o número 7 e 1 bit para representar o número fracionário:

  • Número 7 em binário = 111
  • Número 0,5 em binário = 1

Nesse caso, expressamos o formato do ponto fixo com UQ3.1, pois são 3 dígitos para o 7 e 1 dígito para o 0,5. O “U” na frente do “Q” representa a palavra “unsigned”, cujo significado é “sem sinal”, portanto esse formato não suporta sinal negativo e não pode representar valores negativos.

Por exemplo, o formato Q5.10 teria um tamanho de 16 bits (w = 16): 1 bit para o sinal, 5 bits para a parte inteira e 10 bits para a parte fracionária. Se usarmos o formato UQ4.12, teríamos um tamanho de 16 bits (w = 16): 4 bits para a parte inteira e 12 bits para a parte fracionária.

(U)Qm.n (U)Qm.n

  • U: usado quando não há exigência de sinal positivo ou negativo
  • m: porção inteira de um número
  • n: porção fracionária de um número

O símbolo “w” é usado para representar o tamanho (quantidade de bits). O w pode ser calculado da seguinte forma:
w=(1)+m+n w = (1) + m + n

  • w: tamanho em bits

O número (1) pode ser removido caso o formato seja unsigned (sem sinal).

Como funciona o ponto fixo?

Imagine que temos um valor com o formato UQ4.4 com um w de 8 bits e queremos transformar o número 9,8125109,8125_{10} em numeração binária. Primeiro, transformamos a parte inteira (m) em binário:

  • 9 / 2 = 4 (sobra 1)
  • 4 / 2 = 2 (sobra 0)
  • 2 / 2 = 1 (sobra 0)
  • 1 / 2 = 0 (sobra 1)
  • 910=100129_{10} = 1001_{2}

Em seguida, transformamos a parte fracionária (n) em binário:

  • 0,8125 * 2 = 1,625 (sobra 1)
  • 0,625 * 2 = 1,25 (sobra 1)
  • 0,25 * 2 = 0,5 (sobra 0)
  • 0,5 * 2 = 1 (sobra 1)
  • 0,812510=110120,8125_{10} = 1101_{2}

É possível perceber que a parte inteira e a parte fracionária devem ser calculados de modo diferente, enquanto a parte inteira divide, a parte fracionária multiplica.

lógica do ponto fixo

Visualizando a imagem acima, usando o ponto fixo com formato UQ4.4 podemos perder precisão para expressar alguns valores. O cálculo vai dar o valor mais aproximado dentro dos limites do formato proporcionado. Para saber a faixa que a notação Q pode cobrir usamos o esquema abaixo:

Notação Faixa de valores representáveis
Signed Qm.n 2m1ateˊ+2m12n-2^{m-1} até +2^{m-1} 2^{-n}
Unsigned UQm.n 0ateˊ+2m2n0 até +2^{m} 2^{-n}

Por exemplo, o formato Q8.8 pode representar um valor dentro de uma faixa com valor mínimo de -128.0 até o valor máximo de 127.99609375 que pode ser representado com 281ateˊ+28128-2^{8-1} até +2^{8-1} 2^{-8}. Caso o formato fosse UQ8.8 essa representação poderia mudar para 0 ateˊ+2828até +2^{8} 2^{-8} que é uma faixa com valor mínimo de 0 até o valor máximo de 255.99609375.

Cálculos de aritmética usando o ponto fixo

Contas de adição, subtração, multiplicação e divisão também são possíveis usando o ponto fixo.

Conta de adição com ponto fixo

Por exemplo, imagine números representados em 8 bits com o formato de UQ4.4. Se tivermos os números 4,5104,5_{10} e 1,5101,5_{10}, o resultado deverá ser 6106_{10}. Se transformados para números binários, os números são respectivamente:

  • 4,5104,5_{10} = 0100,120100,1_{2}
  • 1,5101,5_{10} = 0001,120001,1_{2}

O resultado da soma acima será de 0110,020110,0_{2} que é 6106_{10}.

Conta de subtração com ponto fixo

Mais uma vez usando números de 8 bits com o formato de UQ4.4, temos os seguintes valores:

  • 4,5104,5_{10} = 0100,120100,1_{2}
  • 2,0102,0_{10} = 0010,020010,0_{2}

O resultado da subtração acima será de 0010,120010,1_{2} que é 2,5102,5_{10}.

Conta de multiplicação com ponto fixo

A multiplicação de dois números com ponto pode ser realizado do modo convencional, porém exige um passo extra que é o deslocamento do ponto para a esquerda (shift). Veja o exemplo abaixo:

  • 2,25102,25_{10} = 0010,0120010,01_{2}

Ao multiplicar o número acima por ele mesmo teremos 5,0625105,0625_{10}. No processo de multiplicação em binários, a seguinte resolução será efetuada:

  • 0010,0120010,0120010,01_{2} * 0010,01_{2} = 101,00012101,0001_{2} >> 2 = 10100,01210100,01_{2} = 5,0625105,0625_{10}

Repare que após a multiplicação um shift de duas casas do ponto para a direita é realizado para que o resultado final correto seja obtido.

Conta de divisão com ponto fixo

Assim como a multiplicação, a divisão com dois valores contendo ponto fixo também pode ser feita do modo convencional. Para facilitar, podemos usar a mesma técnica que aplicamos na resolução decimal, deslocando a vírgula duas casas para a direita:

  • 4,510÷2,25104,5_{10} \div 2,25_{10} = 45010÷22510450_{10} \div 225_{10} = 2102_{10}

A divisão usando os mesmos valores em forma binária devem trazer o mesmo resultado que acima.

  • 100,12÷10,01100,1_{2} \div 10,01 = 100102÷1001210010_{2} \div 1001_{2} = 10210_{2}

Conclusão

O ponto fixo foi substituído pelo ponto flutuante em muitos casos, mas ainda continua sendo adotado e utilizado em ocasiões onde a precisão e a flexibilidade dos cálculos não é tão importante. Mesmo assim, o ponto fixo tem um custo bem menor, tendo um desempenho melhor em questão de velocidade. Porém, o melhor desempenho depende do contexto geral, incluindo muitos outros elementos decisivos.

Além da imprecisão de resultados, os cálculos envolvendo ponto fixo exigem que os números estejam ajustados na mesma escala, isso é, os dois valores devem ter pontos fixos em locais iguais, tendo formatos iguais.

Projetos práticos

Integrando Laravel com o protocolo MQTT para comunicação entre dispositivos

Projeto de comunicação entre dois dispositivos ESP8266 e Raspberrypi4. Laravel irá funcionar como servidor e receptor de dados de temperatura e umidade coletados com o DHT11.

Tutorial de programação do jogo da serpente em javascript

Programando o clássico jogo da serpente usando o framework p5.js. Tutorial indicado para iniciantes da programação que querem aprender os conceitos básico da área criando jogos.

Usando dados fornecidos pelo TSE para simular o gráfico das eleições presidenciais de 2022

Simulação dos gráficos do segundo turno das eleições presidenciais, utilizando python e ferramentas de análise de dados, pandas e jupyter.

Criando um jogo de pacman usando javascript e pixi.js (parte 1)

Desenvolvimento dos conceitos mais básicos do clássico pacman, como: mapa, animação, deslocamento e detector de colisões.

Criando artes de texto usando imagens

Convertendo imagens para ascii art usando o valor da intensidade das cores cinzentas.

Veja também

O endereçamento de dispositivos na internet é automatizado graças ao DHCP

Antigamente o endereçamento de dispositivos era feito manualmente, porém isso traz muitas dificuldades em questão de administração. O DHCP resolve esses problemas

Nunca se sabe quando tem alguém nos espionando no nosso computador

Um computador conectado à internet está exposto a diversos perigos. O spyware é um deles e é esse malware responsável por roubar contas de redes sociais.

PERT Técnica de avaliação e revisão de programa

O PERT é um método composto por linhas e nós conectados entre si com o intuito de representar a dependência entre as atividades.

Vetores geométricos

Caracterizam uma grandeza física que possui módulo, direção e sentido. Pode simular eventos como queda, atração e deslocamento de objetos em um meio.

FPU Unidade de ponto flutuante

Faz cálculos aritméticos com números fracionários usando notação científica, economizando mais bits. Também chamado de vírgula flutuante.

Terminal

Interface dedicada ao desenvolvedor ou especialista da computação para executar comandos ao computador sem a presença de um mouse.