FP fai-da-te - Implementazione della matematica in virgola mobile su un microcontrollore senza FPU hardware


8

Sto lavorando a un piccolo progetto personale (mirato a un'elica Parallax, ma questo dovrebbe essere piuttosto generalizzabile) che richiede matematica in virgola mobile.

Il microcontrollore con cui sto lavorando non ha una virgola mobile nativa o una libreria a virgola mobile di serie.

Esistono buone risorse o tutorial sull'implementazione della matematica in virgola mobile? Preferibilmente con risorse davvero limitate (non ho nemmeno uno stack!).


Vorrei supportare doublegalleggianti di dimensioni. L'elica è una MCU a 32 bit, quindi dovrò usare più variabili per ogni float.

So che esiste una libreria software a virgola mobile per l'elica, ma supporta solo singlegalleggianti di dimensioni.

No, probabilmente non ho davvero bisogno doubledi galleggianti di dimensioni, ma sembra un progetto davvero interessante. La metà del motivo per cui voglio farlo è perché imparerò molto lungo la strada.


quale compilatore? Potrei averlo perso, ma non vedo che lingua stai usando.
Kortuk,

@Kortuk - Personalmente prendo di mira un'elica Parallax, quindi sarà Spin o Asm. Tuttavia, penso che questo non dovrebbe essere troppo specifico per la lingua. Supponiamo che io abbia le operazioni comuni (+ - / * bit-shifting, bitwise e / o / etc ..).
Connor Wolf,

Quali operazioni è necessario implementare? Se vuoi solo aggiungere, sottrarre e moltiplicare e non sei troppo preoccupato per casi limite, NaN, ecc., Dovrebbe essere piuttosto banale implementarlo. L'ho fatto per microcontrollori a 8 bit in passato e non è un compito enorme, anche se lo fai tutto in un modo.
Paul R,

1
Bene, come dici, imparerai molto sull'implementazione di operazioni in virgola mobile lungo la strada.
Paul R,

3
Forse non hai bisogno di virgola mobile. Se hai solo bisogno di numeri frazionari, anche l'aritmetica a punto fisso con punto decimale (binario effettivo) spostato in alcuni punti a sinistra può fare. Puoi dirci di più sulla tua applicazione?
Cagliata

Risposte:


4

Se vuoi farlo da solo, direi di farlo.

Immagino che non troverai troppe risorse o tutorial perché non c'è molto da fare.

Ecco uno schema:

  • aggiunta / sottrazione:
    se gli esponenti differiscono troppo (più che la mantissa ha bit):
    restituisce semplicemente il valore con esponente più grande (se questo è il subtrahend: negate)

    se gli esponenti sono simili:
    sposta la mantissa di valore inferiore in base alla differenza degli esponenti e aggiungi / sottrai dall'altra mantissa (usando l'aritmetica a punto fisso)
    se il risultato non è 0: sposta la mantissa verso l'alto fino a quando MSBit del risultato è 1 e decrementa l'esponente dello stesso importo

  • moltiplicazione / divisione:
    moltiplicare / dividere le mantisse (usando l'aritmetica a punto fisso) e aggiungere / sottrarre esponenti


2

Dovresti essere in grado di utilizzare questa libreria a virgola mobile a precisione multipla sull'elica, con Catalina C o gcc. Tuttavia, potrebbe essere troppo lento per molte applicazioni.


Il codice C sull'elica può interagire con Spin o prop-asm? In caso contrario, potrei provare a tradurlo per girare. Fortunatamente, non ho bisogno di molta velocità. Realisticamente, devo fare 7 operazioni, a 2 hz.
Connor Wolf,

2
Oh ragazzo, la fonte da sola è 1,1 MB, zippata . Penso che sia un po 'eccessivo. Ci sono opzioni più semplici?
Connor Wolf,

2
Ancora più importante, questa libreria (1) riguarda la virgola mobile a precisione arbitraria (non dimensioni native come 32-bit e 64-bit) e (2) si rivolge a compilatori Linux su processori Intel i386 e x64 Intel, AMD e MIPS. C'è una menzione di "arm" e "generico" nelle cartelle di origine, ma non vorrei iniziare qui.
Kevin Vermeer,

2

Sembra che questa domanda abbia assunto la tendenza a cercare di capire più che a risolvere il problema, quindi questa potrebbe non essere la risposta più utile, ma solo per completezza

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

Implica che la versione con elica di GCC abbia un supporto in virgola mobile, inclusi i doppi.

GCC e le sue librerie del compilatore sono ovviamente open source, anche se potrebbe esserci una vera curva di apprendimento prima che tu possa iniziare a vedere cosa sta facendo il codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.