Neway Inserito: 26 agosto 2011 Segnala Inserito: 26 agosto 2011 (modificato) Rieccomi qui ad intasare il forum 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: 26 agosto 2011 da Neway
Livio Orsini Inserita: 26 agosto 2011 Segnala Inserita: 26 agosto 2011 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.
accacca Inserita: 26 agosto 2011 Segnala Inserita: 26 agosto 2011 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 decimaliconsidero 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.
Livio Orsini Inserita: 26 agosto 2011 Segnala Inserita: 26 agosto 2011 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.
Neway Inserita: 26 agosto 2011 Autore Segnala Inserita: 26 agosto 2011 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!
RealTime Inserita: 26 agosto 2011 Segnala Inserita: 26 agosto 2011 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 seguenteIl 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 1Fai attenzione che il campo esponente è BIASED ovvero esiste un'offset che ne rende possibile l'estensione numerica tra -127 e +127Ti faccio un esempioPrendiamo il numero 1000Segno = 0Esponente = 9Mantissa = 1.95312501000 = 2^9 * 1.9531250Prendiamo ora il numero 500 ( 1000 / 2)Segno = 0Esponente = 8Mantissa = 1.9531250500 = 2^8 * 1.9531250Come vedi e' bastato decrementare di uno l'esponente per dividere per 2 il nostro FP 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 ...RTRT
Neway Inserita: 26 agosto 2011 Autore Segnala Inserita: 26 agosto 2011 Ho capito molto bene e ora so una cosa in più. Grazie mille!
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora