Digamos que tengo un flotador en el rango de [0, 1] y quiero cuantizarlo y almacenarlo en un byte sin signo. Suena como una obviedad, pero en realidad es bastante complicado:Conversión/cuantificación del rango de flotación al rango entero
La solución obvia es el siguiente:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
Esto funciona en la medida en que consigo todos los números del 0 al 255, pero la distribución de los enteros no es par. La función solo devuelve 255
si a es exactamente 1.0f
. No es una buena solución.
Si hago redondeo adecuado acabo de desplazar el problema:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
Aquí el resultado 0
sólo cubre la mitad del flotador alcance que cualquier otro número.
¿Cómo hago una cuantificación con igual distribución del rango de coma flotante? Idealmente, me gustaría obtener una distribución equitativa de enteros si cuantifico flotantes aleatorios distribuidos por igual.
¿Alguna idea?
Btw: También mi código está en C, el problema está en el idioma. Para las personas que no son C: simplemente asuma que la conversión float
a int
trunca el flotador.
EDIT: Ya que tenía cierta confusión aquí: necesito un mapeo que mapea el flotador de entrada más pequeño (0) a la unsigned char más pequeño y el más alto del flotador de mi alcance (1.0f) al byte sin signo más alto (255)
wow - Sí, eso es todo! –
Sí - (carácter sin signo) (a * 256.0f) le proporciona exactamente lo que desea para cada valor de entrada, excepto para 1.0.C no tiene una función mínima incorporada, por lo que tendrá que escribir la suya propia si aún no lo hizo. –
John, se me ocurrió el mismo resultado, simplemente no fue capaz de transferirlo correctamente desde la hoja de cálculo de Excel. Borré mi respuesta embarazosa. – cdonner