DIY FP - Implementando a matemática de ponto flutuante em um microcontrolador sem uma FPU de hardware

8

Estou trabalhando em um pequeno projeto pessoal (visando uma hélice Parallax, mas isso deve ser bastante generalizável) que precisa de matemática de ponto flutuante.

O microcontrolador com o qual estou trabalhando não possui ponto flutuante nativo ou uma biblioteca de ponto flutuante padrão.

Existem bons recursos ou tutoriais para implementar a matemática de ponto flutuante do software? De preferência com recursos realmente limitados (eu nem tenho uma pilha!).


Eu gostaria de apoiar double carros alegóricos de tamanho. A hélice é um MCU de 32 bits, então terei que usar várias variáveis ​​para cada flutuador.

Eu sei que existe uma biblioteca de ponto flutuante de software para a hélice, mas ela suporta apenas single flutuadores de tamanho.

Não, provavelmente não preciso doublede carros alegóricos de tamanho, mas isso soa como um projeto realmente interessante. Metade da razão pela qual quero fazer isso é porque aprenderei muito ao longo do caminho.

Connor Wolf
fonte
qual compilador? Eu posso ter esquecido, mas não vejo qual idioma você está usando.
Kortuk
@ Kortuk - Estou pessoalmente mirando uma hélice de paralaxe, por isso será Spin ou asm. No entanto, acho que isso não deve ser muito específico do idioma. Suponha que eu tenho as operações comuns (+ - / * bit-shift, bit a bit e / ou / etc ..).
Connor Lobo
Quais operações você precisa implementar? Se você apenas deseja adicionar, subtrair e multiplicar, e não está muito preocupado com casos extremos, NaNs, etc., deve ser bastante trivial implementar isso. Eu já fiz isso para microcontroladores de 8 bits no passado e não é uma tarefa gigantesca, mesmo que você faça tudo da mesma forma.
Paul R
1
Bem, como você diz, aprenderá muito sobre a implementação de operações de ponto flutuante ao longo do caminho.
Paul R
3
Talvez você não precise de ponto flutuante . Se você só precisa de números fracionários, também a aritmética do ponto fixo com o ponto decimal (binário real) deslocado em alguns lugares para a esquerda pode fazer. Você pode falar mais sobre sua inscrição?
Requeijão

Respostas:

4

Se você quiser fazer isso sozinho, eu diria apenas faça.

Eu acho que você não encontrará muitos recursos ou tutoriais, porque não há muito.

Aqui está um esboço:

  • somando / subtraindo:
    se expoentes diferem muito (mais do que a mantissa possui bits):
    basta retornar o valor com expoente maior (se esse for o subtraendo: negate)

    se expoentes são semelhantes:
    mude a mantissa de menor valor pela diferença de expoentes e adicione / subtraia de outra mantissa (usando aritmética de ponto fixo)
    se o resultado não for 0: mude a mantissa até MSBit do resultado ser 1 e diminua o expoente a mesma quantidade

  • multiplicação / divisão:
    multiplique / divida mantissas (usando aritmética de ponto fixo) e adicione / subtraia expoentes

Coalhada
fonte
2

Você deve poder usar esta biblioteca de ponto flutuante de precisão múltipla no Propeller, com Catalina C ou gcc. No entanto, pode ser muito lento para muitos aplicativos.

Leon Heller
fonte
O código C da hélice pode interoperar com o Spin ou prop-asm? Caso contrário, eu poderia traduzi-lo para girar. Felizmente, não preciso de muita velocidade. Realisticamente, preciso fazer 7 operações, a 2 hz.
Connor Lobo
2
Oh garoto, a fonte sozinha é de 1,1 MB, compactada . Eu acho que é um pouco exagerado. Existem opções mais simples?
Connor Lobo
2
Mais importante, esta biblioteca (1) é sobre ponto flutuante de precisão arbitrária (não tamanho nativo como 32 bits e 64 bits) e (2) é direcionada aos compiladores Linux nos processadores i386 e x64 Intel, AMD e MIPS. Há uma menção de 'arm' e 'genérico' nas pastas de origem, mas eu não começaria aqui.
Kevin Vermeer
2

Parece que esta questão assumiu a tendência de buscar entender mais do que resolver o problema, portanto essa pode não ser a resposta mais útil, mas apenas por uma questão de integridade.

http://code.google.com/p/propgcc/wiki/PropGccCompileOptions

Implica que a versão de hélice do GCC possui suporte de ponto flutuante, incluindo dobras.

É claro que o GCC e suas bibliotecas de compiladores são de código aberto, embora possa haver uma curva de aprendizado real antes que você possa começar a ver o que o código está fazendo.

Chris Stratton
fonte