Vai al contenuto
PLC Forum


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


Neway

Messaggi consigliati

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?

Modificato: da Neway
Link al commento
Condividi su altri siti


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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...