Pergunta

dizer que tenho um flutuador na faixa de [0, 1] e eu quero quantificar e armazená-lo em um byte não assinado. Soa como um acéfalo, mas na verdade é bastante complicado:

A solução parece óbvia como esta:

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

Isso funciona na medida em que eu recebo todos os números de 0 a 255, mas a distribuição dos inteiros não é mesmo. A função só retorna 255 se um é exatamente 1.0f. Não é uma boa solução.

Se eu fizer adequada arredondamento Eu só deslocar o problema:

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

Aqui, o do 0 resultado abrange apenas metade da bóia-range do que qualquer outro número.

Como eu faço uma quantização com igual distribuição da gama de ponto flutuante? Idealmente, eu gostaria de obter uma distribuição igual de inteiros se eu Quantize igualmente distribuídos carros alegóricos aleatórios.

Todas as idéias?


Btw: Também o meu código está em C o problema é a linguagem-agnóstico. Para as pessoas não-C: Apenas supor que float à conversão int trunca o flutuador

.

EDIT: Uma vez que tínhamos alguma confusão aqui: Eu preciso de um mapeamento que mapeia o flutuador menor entrada (0) para o menor unsigned char, eo maior flutuação da minha faixa (1.0f) para o mais alto byte sem sinal (255).

Foi útil?

Solução

Como cerca a * 256f com um cheque para reduzir 256 a 255? Então, algo como:

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

(Para uma função min adequado em sua plataforma -. Não me lembro a função C para ele)

Basicamente, você quer dividir a gama em 256 partes iguais, que é o que deve fazer. O caso de ponta para 1,0 indo para 256 e que exige o arredondamento para baixo é apenas porque o domínio é inclusiva em ambas as extremidades.

Outras dicas

Eu acho que o que você está procurando é a seguinte:

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

Este vai mapear valores flutuador uniformes no intervalo [0, 1] para valores de byte uniformes no intervalo [0, 255]. Todos os valores em [i / 256, (i + 1) / 256 [(ou seja, excluindo (i + 1) / 256), para i em 0..255, são mapeadas para i. O que pode ser indesejável é que 1.0f é mapeado para 256.0f que envolve a 0.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top