Supponiamo di avere un valore float nell'intervallo [0, 1] e di voler quantizzare e memorizzarlo in un byte senza segno. Suona come un gioco da ragazzi, ma in realtà è piuttosto complicato:Converti/Quantizza intervallo float su intero Intervallo
La soluzione più ovvia è simile al seguente:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
Questo funziona nella misura che ho tutti i numeri da 0 a 255, ma la distribuzione degli interi non è pari. La funzione restituisce solo 255
se a è esattamente 1.0f
. Non è una buona soluzione.
Se faccio corretto arrotondamento me a spostare il problema:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
Qui il risultato 0
copre solo metà del galleggiante gamma di qualsiasi altro numero.
Come si effettua una quantizzazione con distribuzione equa dell'intervallo di virgola mobile? Idealmente mi piacerebbe ottenere una distribuzione equa degli interi se quantizzo equamente i float casuali distribuiti equamente.
Qualche idea?
Btw: Anche il mio codice è in C il problema è linguistico-indipendente. Per le persone che non fanno parte di C: supponiamo che la conversione da float
a int
tronca il float.
EDIT: Dato che avevamo una certa confusione qui: ho bisogno di una mappatura che mappa il galleggiante di ingresso più piccolo (0) al più piccolo unsigned char, e il più alto galleggiante della mia fascia (1.0f) al più alto byte senza segno (255).
wow - sì, è proprio così! –
Sì - (unsigned char) (a * 256.0f) fornisce esattamente ciò che si desidera per ogni valore di input ad eccezione di 1.0.C non ha una funzione min integrata, quindi dovrai scrivere la tua se non lo hai già fatto. –
John, mi è venuta in mente lo stesso risultato, non è stato in grado di trasferirlo correttamente dal foglio di calcolo di Excel. Ho cancellato la mia risposta imbarazzante. – cdonner