Os números dentro dos microcontroladores típicos não têm pontos decimais. Eles são números inteiros binários. Não há decimal acontecendo dentro da máquina. O compilador ou montador pode permitir que você especifique constantes dessa maneira, mas elas são convertidas em binárias antes que a máquina as veja.
No entanto, você pode decidir quais unidades desejar para os valores inteiros. Por exemplo, suponha que você queira representar dólares dentro de um micro. Não pode nativamente fazer $ 3,21, mas poderia custar 321 centavos. O micro está operando apenas com o valor 321, mas você sabe que representa unidades de 1/100 dólares.
Esse é apenas um exemplo para ilustrar o conceito de unidades arbitrárias. Muitas vezes, os números são representados com vários bits de fração binária. É o mesmo que dizer que cada contagem representa um valor de 2- N , onde N é o número de bits da fração. Essa representação é chamada "ponto fixo". Você decide antecipadamente quanta resolução precisa e finge que há bits suficientes à direita do ponto binário imaginado para suportar essa resolução. Por exemplo, digamos que você precise representar algo com pelo menos uma resolução de 1/100. Nesse caso, você usaria pelo menos 7 bits de fração desde 2 7 = 128. Isso fornecerá uma resolução de 1/128.
A máquina não tem idéia do que está acontecendo. Ele irá adicionar e subtrair esses números como números inteiros comuns, mas tudo ainda funciona. Fica um pouco complicado quando você multiplica e divide valores de pontos fixos. O produto de dois valores de ponto fixo com N bits de fração terá 2N bits de fração. Às vezes, você apenas acompanha o fato de que o novo número tem 2N bits de fração ou, às vezes, pode alterá-lo para N bits para voltar à mesma representação de antes.
O ponto flutuante é a mesma coisa, mas o número de bits de fração é armazenado junto com a parte inteira, para que esse ajuste possa ser feito em tempo de execução. A execução de operações matemáticas em números de ponto flutuante pode levar vários ciclos. O hardware de ponto flutuante faz tudo isso para você, para que as operações sejam concluídas rapidamente. No entanto, as mesmas manipulações também podem ser executadas em software. Não há razão para que você não possa escrever uma sub-rotina para adicionar dois números de ponto flutuante, apenas que levaria muito mais tempo que o hardware dedicado fazendo a mesma coisa.
Eu defini um formato de ponto flutuante de 3 bytes para PICs de 8 bits e escrevi várias rotinas para manipulá-las. Os microcontroladores geralmente lidam com valores do mundo real com precisão de 10 ou 12 bits, no máximo. Meu formato de ponto flutuante usa 16 bits de precisão, o que é suficiente para vários cálculos intermediários.
Eu também tenho um formato de 32 bits para os PICs de 16 bits. Isso usa uma palavra de 16 bits para a mantissa, o que acelera os cálculos, pois esses PICs podem operar em 16 bits por vez.
Essas rotinas estão incluídas na minha versão das Ferramentas de desenvolvimento PIC . Após a instalação, observe os arquivos com "fp24" em seu nome no diretório SOURCE> PIC e "fp32f" no diretório SOURCE> DSPIC.