Disons que j'ai un flottant dans la plage de [0, 1] et que je veux quantifier et stocker dans un octet non signé. Sonne comme une évidence, mais en fait, il est assez compliqué:Convertir/Quantifier la plage flottante en entier Nombre
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 distribution des entiers n'est pas pair. La fonction renvoie uniquement 255
si a 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);
}
Voici le résultat 0
ne couvre que la moitié de la gamme float que tout autre nombre.
Comment effectuer une quantification avec une distribution égale de la plage de virgule flottante? Idéalement, j'aimerais obtenir une distribution égale des entiers si je quantifie des flottants aléatoires également distribués.
Des idées? Btw: Aussi mon code est en C le problème est indépendant de la langue. Pour les personnes non-C: Supposons simplement que la conversion float
en int
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) au plus haut octet non signé (255).
wow - oui, voilà! –
Oui - (caractère non signé) (a * 256.0f) vous donne exactement ce que vous voulez pour chaque valeur d'entrée sauf pour 1.0.C n'a pas de fonction min intégrée, vous devrez donc écrire le vôtre si vous ne l'avez pas déjà fait. –
John, j'ai trouvé le même résultat, mais je n'ai pas réussi à le transférer correctement depuis la feuille de calcul Excel. J'ai supprimé ma réponse embarrassante. – cdonner