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: 1239



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

Criando um jogo de guerra nas estrelas em javascript usando a biblioteca p5.js

Jogo simples de guerra espacial desenvolvido em javascript. Esse jogo usa cálculos de física para simular efeitos de atrito e inércia.

Desenvolvendo um jogo de quebra blocos em javascript

Programando um jogo clássico de arcade usando javascript e p5.js. O usuário deve quebrar os blocos utilizando uma bola ao mesmo tempo que evita que a bola saia pela parte inferior da tela

Criando um sistema de mini garagem automatizada integrada com um sistema de monitoramento independente

Desenvolvimento de um sistema de monitoramento que exibi todos os eventos que acontecem na garagem automatizada, como abertura de portões ou ocupação de vagas.

Integrando o PHP com Elasticsearch no desenvolvimento de um sistema de busca

Projeto de criação de um sistema de busca usando o framework Symfony e Elasticsearch. A integração com Kibana também é feito de modo remoto com um raspberrypi.

Implementando um algoritmo de pathfinding

Implementando um programa que encontra a menor distância entre dois pontos dentro de um labirinto usando o algoritmo A* (a-estrela).

Veja também

A maioria dos sistemas atuais usam a nuvem para o armazenamento e o acesso de dados

A nuvem pode ser uma boa alternativa de substituição da memória atual. Além de fazer a cópia de segurança dos dados, pode ser acessível de qualquer lugar.

A manutenção de softwares é o maior pesadelo de um programador quando o código parece um campo minado

Existe muitos programadores que escrevem algoritmos mal planejados. Essa falta de planejamento dificulta a manutenção do aplicativo e aumenta a probabilidade de novos bugs.

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.

Algoritmo A* (A-estrela)

Algoritmo que busca o caminho com o menor custo entre dois pontos. É usado em jogos e aplicativos de navegação para calcular a menor distância possível.