Jump to content
PLC Forum


Bit Shift Con Variabili Float - Possibilità di una divisione veloce


Neway
 Share

Recommended Posts

Rieccomi qui ad intasare il forum tongue.gif

E' noto che dovendo dividere un intero per 2^n basta fare uno shift di n posti, e ciò permette calcoli molto veloci.

Nella mia tesi sto avendo a che fare con variabili float e la risposta del compilatore è ovviamente:

Error [1136] integer operands required for shift operator

Domanda: c'è un modo di condurre in maniera efficiente moltiplicazioni e divisioni per multipli di 2 di variabili float?

Grazie mille!

AGGIUNTO DOPO LA MODIFICA:

Ho notato che nella libreria matematica del C18 c'è una funzione ldexp che serve a moltiplicare o dividere i float per multipli di due. E' per caso una funzione particolarmente efficiente risperro a una classica divisione?

Edited by Neway
Link to comment
Share on other sites


Livio Orsini

La divisione Sw tra float è sempre la più lunga delle operazioni aritmentiche fondamentali.

In alcuni casi, come quello che citi, si sviluppano funzioni dedicate, che riducono i tempi di esecuzione, per divisori particolari.

Verifica il tempo dichiarato sarà inferiore al tempo della divisione generica.

Link to comment
Share on other sites

Non so cosa stai facendo e forse ti faccio solo perdere tempo ma se il PIC è quello della discussione precedente (18F2553) secondo me usare i float non è il massimo.

Se i valori in gioco lo consentono potresti usare int scalando il risultato.

Ad esempio se vuoi una temperatura tra 0.00 e.100.00°C con due decimali

considero numeri interi tra 0 e 10000. lavori solo con aritmetica intera e solo nella visualizzazione inserisci il separatore decimale prima delle ultime due cifre.

Se superi i 16 bit puoi usare i long secondo me le operazioni sono meno pesanti del float.

Link to comment
Share on other sites

Livio Orsini

Alle volte sei costretto ad usare le variabili in float per questione di decimali. E' classico il caso dell'integratore. Sei costretto a non trascurare nulla per non avere il rischio, molto reale, di non riuscire a regolare decentemente.

Link to comment
Share on other sites

In effetti il progetto è abbastanza complesso. Si tratta di un sistema di stabilizzazione attiva di un modello volante, quindi sto manipolando velocità, accelerazioni, velocità angolari, ecc. quindi ho bisogno dei float.

Per fortuna mi basta una frequenza di aggiornamento dati di 256Hz, e in questo tempo rientro anche se un po' stretto.

In ogni caso ho visto che l'operazione più lunga di tutte è un elevamento a potenza di un float con esponente anch'esso float che prende ben 1,5ms con il FOSC a 48Mhz. Se mi trovo proprio in difficoltà linearizzerò questa espressione, ma sono quasi alla fine del firmware e sono ottimista.

Grazie dell'ennesima consulenza!

Link to comment
Share on other sites

Operazione di divisione e moltiplicazione per due in floating point sono ovviamente ottimizzabili e molto semplici da implementare. Se il tuo compilatore rispetta lo standard IEEE 754 (32/64) la procedura è la seguente

Il FP viene conservato in memoria con la seguente annotazione:

Nello standard IEEE754 a 32 bits esistono

- Segno(1 Bit)

- Esponente(8 bits)

- Mantissa(23 bits)

Per dividere un FP per 2 è sufficiente decrementare il campo dell'esponente di 1

Fai attenzione che il campo esponente è BIASED ovvero esiste un'offset che ne rende possibile l'estensione numerica tra -127 e +127

Ti faccio un esempio

Prendiamo il numero 1000

Segno = 0

Esponente = 9

Mantissa = 1.9531250

1000 = 2^9 * 1.9531250

Prendiamo ora il numero 500 ( 1000 / 2)

Segno = 0

Esponente = 8

Mantissa = 1.9531250

500 = 2^8 * 1.9531250

Come vedi e' bastato decrementare di uno l'esponente per dividere per 2 il nostro FP smile.gif

Alcuni processori possono eseguire questo trucchetto con una sola istruzione. Lavorando con i DSP ed i sistemi Heavy Real-Time ci si deve abituare alla scrittura di queste otimizzazioni ...

RT

RT

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...