Geralmente usamos microcontroladores para fazer as coisas em nossos robôs, mas precisamos fazer alguns cálculos em decimal. O uso de variáveis de ponto flutuante é muito lento, porque uma biblioteca de ponto flutuante de software é incluída automaticamente (a menos que você tenha um microcontrolador de última geração). Portanto, geralmente usamos aritmética de ponto fixo.
Sempre que faço isso, apenas uso um número inteiro e lembro onde fica a casa decimal. No entanto, é preciso algum cuidado para garantir que tudo seja consistente, especialmente quando os cálculos envolvem variáveis em que o ponto decimal está em um local diferente.
Eu implementei uma função atan2 de ponto fixo, mas como estava tentando espremer toda última gota de precisão limitada (16 bits), muitas vezes mudava a definição de onde está o ponto decimal e mudava à medida que o aprimorava. Além disso, eu teria algumas constantes, como uma tabela de consulta quase, que possuem um ponto decimal implícito em algum lugar.
Eu quero saber se existe uma maneira melhor. Existe uma biblioteca ou conjunto de macros que pode simplificar o uso de variáveis de ponto fixo, facilitando a multiplicação e a divisão entre variáveis mistas e permitindo a declaração de números decimais ou expressões constantes, mas convertendo automaticamente para a representação de ponto fixo desejada na compilação Tempo?
fonte
Respostas:
Seria bom se pudéssemos dizer ao compilador o alcance e a precisão de cada variável de entrada de ponto fixo (talvez dois não possuíssem o ponto de radix no mesmo local), e ele automagicamente - em tempo de compilação - usasse o intervalo correto e operações de precisão e redimensionamento para os valores intermediários e finais em uma série de cálculos. Ouvi rumores de que talvez seja possível fazer isso na linguagem de programação Ada ou nos modelos C ++.
Infelizmente, o mais próximo que eu vi são bibliotecas aritméticas de ponto fixo que exigem que o programador escolha manualmente a representação correta e verifique manualmente se cada operação mantém alcance e precisão adequados. Às vezes, facilitam a multiplicação e a divisão entre variáveis mistas. Tal como:
fonte
Usei a TI IQMath Library para implementar o ponto flutuante virtual em seus DSPs de ponto fixo.
Isso usa algumas coisas específicas da TI, mas também usei esse código como base para implementar a matemática de ponto flutuante virtual em outros microcontroladores. É preciso um pouco de trabalho para transportar, mas é muito mais fácil do que começar do zero.
fonte
Existem várias implementações (sem bibliotecas que conheço imediatamente) do Binary Scaling (também conhecido como B-scaling)
Nesse caso, você mantém uma nota mental (ou, melhor ainda, documenta o código ...) de onde está o ponto decimal, usando turnos para mover o ponto decimal para cima ou para baixo.
Eu usei o escalonamento B no assembler em projetos de defesa, mesmo nas menores CPUs, para garantir sua adequação a qualquer outra coisa ...
fonte
Se você usar um inteiro para lembrar onde o "ponto" é, eles são tipo de usar aritmética de ponto flutuante. Ponto fixo, realmente tem ponto fixo .
atan
cos
Isso depende do intervalo de valores que seu aplicativo precisa, mas você pode querer mudar completamente para uma representação de ponto fixo. Ou seja, por exemplo, em vez de manter um número como este:
onde
number
está o número inteiro edecimal_point
diz onde está o ponto decimal, você pode armazená-lo assim:onde está o número inteiro
integer.fraction
, que possui o mesmo uso de memória, maior intervalo de valores e, em geral, mais simples de usar.fonte
#define
, certo? Eu pensei que você realmente o armazenasse e isso pode variar de acordo com o tamanho do seu número.