2013-04-09 30 views
9

Ho un coprocessore collegato al processore principale. Alcuni calcoli in virgola mobile devono essere eseguiti nel coprocessore, ma non supporta le istruzioni hardware in virgola mobile e l'emulazione è troppo lenta.Come eseguire calcoli in virgola mobile con numeri interi

Ora, un modo è quello di avere il processore principale in grado di scalare i valori in virgola mobile in modo che possano essere rappresentati come numeri interi, inviarli al co-processore, che esegue alcuni calcoli e ridimensionare tali valori al ritorno. Tuttavia, ciò non funzionerebbe per la maggior parte del tempo, poiché i numeri diventerebbero troppo grandi o piccoli per essere fuori dalla portata di quei numeri interi. Quindi la mia domanda è, qual è il modo più veloce per farlo correttamente.

+1

Scopri come funziona la matematica a virgola mobile. È facile. Avresti dovuto ottenere la maggior parte delle informazioni necessarie a scuola. Il resto può essere trovato online (usa Wikipedia, Google, ecc.). E implementare routine aritmetiche in virgola mobile. –

+0

Ma questo è un metodo lento. Voglio qualcosa di efficiente. – MetallicPriest

+0

@AlexeyFrunze L'OP ha già detto che l'emulazione è troppo lenta. Questo non è un problema di implementazione in virgola mobile. – sfstewman

risposta

13

Stai dicendo che l'emulazione è troppo lenta. Immagino tu intenda l'emulazione del punto mobile. L'unica alternativa rimanente se gli interi in scala non sono sufficienti, è la matematica a virgola fissa, ma non è nemmeno esattamente veloce, anche se è molto più veloce del float emulato.

Inoltre, non si sfuggirà mai il fatto che con entrambi gli interi in scala e fixed point math, si otterrà meno dynamic range rispetto al punto mobile.

Tuttavia, se l'intervallo è noto in anticipo, l'implementazione matematica a virgola fissa può essere regolata per l'intervallo necessario.

Here is un articolo sul punto fisso. Il succo del trucco sta nel decidere come dividere la variabile, quanti bit per la parte bassa e alta del numero.

Un'implementazione completa di punto fisso per C può essere found here. (Licenza BSD.) Ci are others.

+1

Il che significa che tali ottimizzazioni dovrebbero essere fatte caso per caso. Nessun proiettile d'argento. –

+0

@AlexeyFrunze, infatti. Il caso OP sembra essere piuttosto speciale. –

+0

* Quasi * +1. I collegamenti dati sono tutti puramente 'C' e uno è Java. Mi piace GnuPGP per l'aritmetica multi-parola; * l'assemblatore in-line * viene utilizzato per ottenere più velocemente operazioni multi-parola quando disponibili. Penso che anche una libreria C * a punto fisso * potrebbe trarne beneficio. Mentre il punto fisso ha meno * intervallo dinamico *, ha anche molto meno [menti terrestri] (http://www.altdevblogaday.com/2012/02/22/comparing-floating-point-numbers-2012-edition/) , in particolare dato il tag * embedded *. –

3

Oltre al suggerimento di @Amigable Clark Kant, Anthony Williams' fixed point math library fornisce una classe C++ fixed che può essere utilizzato in modo intercambiabile con quasi float o double e su ARM dà un miglioramento di prestazioni rispetto 5x software in virgola mobile. Include una versione completa punto fixed della libreria matematica standard che include le funzioni trig e log ecc. Usando l'algoritmo CORDIC.

+0

Un altro progetto dello stesso tipo è su [progetto ospitato da google] (http://code.google.com/p/fpmath/) e [collegamento del progetto in codice] (http://www.codeproject.com/Articles/37636/Fixed-Point-Class), questi sembrano avere più di una libreria completa che include alcune funzioni trascendentali. –