Question

Dire que j'ai un flotteur dans la plage de [0, 1] et je veux quantifie et le stocker dans un octet non signé. Sonne comme une évidence, mais il est assez compliqué en fait:

La solution évidente ressemble à ceci:

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

Cela fonctionne dans la mesure que je reçois tous les chiffres de 0 à 255, mais la répartition des entiers est même pas. La fonction retourne uniquement 255 si un est exactement 1.0f. Pas une bonne solution.

Si je fais l'arrondissement bon je déplace simplement le problème:

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

Ici, le couvre seulement la moitié de la gamme de flotteur que tout autre numéro le résultat 0.

Comment dois-je faire une quantification avec une répartition égale de la plage de virgule flottante? Idéalement, je voudrais obtenir une répartition égale des entiers si je quantifions équiréparties flotte au hasard.

Toutes les idées?


BTW: Aussi mon code est en C le problème est la langue agnostique. Pour les personnes non-C: Il suffit de supposer que float à int conversion tronque le flotteur

.

EDIT: Depuis que nous avons eu une certaine confusion ici: je besoin d'une carte qui associe le flotteur d'entrée le plus petit (0) au unsigned char le plus petit et le plus haut flotteur de ma gamme (1.0f) à le plus élevé octet non signé (255).

Était-ce utile?

La solution

Que diriez-vous a * 256f un chèque pour réduire 256-255? Donc, quelque chose comme:

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

(Pour une fonction appropriée min sur votre plate-forme -. Je ne me souviens pas de la fonction C pour elle)

Fondamentalement, vous voulez diviser la gamme en 256 parties égales, ce qui est ce qui devrait le faire. Le cas limite pour 1,0 allant à 256 et en exigeant arrondi vers le bas est juste parce que le domaine est inclus aux deux extrémités.

Autres conseils

Je pense que ce que vous cherchez est le suivant:

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

Cela carte des valeurs flottantes uniformes dans [0, 1] aux valeurs d'octets uniformes dans [0, 255]. Toutes les valeurs dans [i / 256, (i + 1) / 256 [(qui exclut (i + 1) / 256), pour i dans 0..255, sont mis en correspondance avec i. Ce qui pourrait être indésirable que 1.0f est mis en correspondance 256.0f qui s'enroule autour de 0.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top