Pregunta

Decir que tengo un flotador en el rango de [0, 1] y quiero cuantificar y almacenarlo en un byte sin signo. Suena como una obviedad, pero en realidad es bastante complicado:

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 números enteros no es uniforme. La función sólo devuelve 255 si a es exactamente 1.0f. No es una buena solución.

Si lo hago redondeo adecuado acabo de desplazar el problema:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f + 0.5f);
}

Aquí el la 0 resultado sólo cubre la mitad del flotador alcance que cualquier otro número.

¿Cómo puedo hacer una cuantificación con igual distribución de la gama de punto flotante? Idealmente me gustaría obtener una distribución equitativa de los números enteros si cuantización igualmente distribuido al azar flotadores.

¿Alguna idea?


BTW: También mi código está en C, el problema es independiente del idioma. Para las personas que no son C: Sólo asumir que float a int conversión 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) a el byte sin signo más alto (255).

¿Fue útil?

Solución

¿Qué hay de a * 256f con un cheque para reducir la tecnología 256 a 255? Así que algo como:

return (unsigned char) (min(255, (int) (a * 256f)));

(Para una función min adecuado de la plataforma -. No puedo recordar la función C para ello)

Básicamente se quiere dividir el rango en 256 partes iguales, que es lo que debe hacer. El caso de borde para 1.0 va a 256 y que requieren el redondeo hacia abajo es sólo porque el dominio está incluido en ambos extremos.

Otros consejos

Creo que lo que busca es la siguiente:

unsigned char QuantizeFloat (float a)
{
  return (unsigned char) (a * 256.0f);
}

Esto asignar los valores de flotador uniforme en [0, 1] para valores de bytes uniformes en [0, 255]. Todos los valores en [i / 256, (i + 1) / 256 [(es decir, excluyendo (i + 1) / 256), para i en 0..255, se asignan a i. Lo que podría ser indeseable es que 1.0f se asigna a 256.0f que se envuelve alrededor de 0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top