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



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 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.

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.

Criando o esqueleto de um jogo de tiro 2D visto de cima usando P5.js

Usando lógicas matemáticas como trigonometria para criar e calcular o esqueleto de um jogo de tiro 2D em javascript

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.

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.

Veja também

Qual é o papel das grandes empresas além de fornecer seu serviços?

Poluição do ar, solo e água ainda é um grande problema para ser resolvido ainda em vários países. Há estudos que comprovam que os países mais poluentes podem causar câncer...

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.

Ciência de dados

Data Science ou ciência de dados, é uma área de computação que se concentra em extrair informações valiosas de grandes quantidades de dados.

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.

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.