Sto sviluppando per la piattaforma AVR e ho una domanda. Non voglio che la libreria in virgola mobile sia collegata al mio codice, ma mi piace il concetto di avere valori analogici del range 0.0 ... 1.0 invece di 0 ... 255 e 0 ... 1023, a seconda di anche se sto usando una porta come input o come output.Ottimizzazione in virgola mobile GCC compatta in tempo
Quindi ho deciso di moltiplicare gli argomenti delle funzioni di input/output per 1023.0 e 255.0, rispettivamente. Ora, la mia domanda è: se a implementare la divisione in questo modo:
#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))
sarà GCC (con la bandiera -O3 acceso) ottimizzare il tempo di compilazione moltiplicazioni in virgola, noti al momento della compilazione e espressi per un integrale galleggiante digitare, in operazioni con numeri interi? (So che quando si utilizzano queste macro con argomenti non costanti, l'ottimizzazione non è possibile, voglio solo sapere se verrà eseguita nell'altro caso.)
Non dovrebbe essere questa una moltiplicazione, non una divisione? ('analog_out (7, 0.5)' diventa una scrittura di '0.5 * 255' sulla porta 7, piuttosto che una scrittura di 0 tagliata da 1/510) ... – Borealid
sì, certo :) Risolto. –
Provalo e scoprilo! 'gcc -S' produrrà un dump di assembly. Probabilmente vuoi '-O2 -ffast-math' per questo, non' -O3' ('-O3' attiva le ottimizzazioni che sono quasi sempre un net * lose *, come inlining troppo aggressivo, è pensato per essere usato un file in cui il tuo programma spende il 90% delle volte). – zwol