Angenommen, ich habe eine Gleitkommazahl im Bereich von [0, 1] und möchte sie in einem Byte ohne Vorzeichen quantisieren und speichern. Klingt wie ein Kinderspiel, aber es ist ziemlich kompliziert in der Tat:Convert/Quantize Float Range zu Integer Range
Die offensichtliche Lösung sieht wie folgt aus:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
Dies funktioniert so weit, dass ich alle Zahlen von 0 bis 255, aber die Verteilung der ganzen Zahlen ist nicht einmal. Die Funktion gibt nur 255
zurück, wenn a genau 1.0f
ist. Keine gute Lösung.
Wenn ich die richtige Rundung kann ich verschieben nur das Problem:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
Hier ist das das Ergebnis 0
deckt nur die Hälfte des Schwimmers-Bereich als jede andere Zahl.
Wie mache ich eine Quantisierung mit gleicher Verteilung des Fließkommabereichs? Idealerweise würde ich gerne eine gleiche Verteilung von ganzen Zahlen erhalten, wenn ich gleichmäßig verteilte zufällige Gleitkommazahlen quantisiere.
Irgendwelche Ideen?
Btw: Auch mein Code ist in C das Problem ist Sprache-agnostic. Für die Nicht-C-Leute: Gehen Sie einfach davon aus, dass float
bis int
Konvertierung den Float abschneidet.
EDIT: Da wir einige Verwirrung hier hatten: Ich brauche eine Abbildung, die den kleinsten Eingang Schwimmer abbildet (0) auf den kleinsten unsigned char und den höchsten Schwimmer meiner Reichweite (1.0f) mit dem höchsten Byte ohne Vorzeichen (255).
wow - ja, das ist es! –
Ja - (unsigned char) (a * 256.0f) gibt Ihnen genau das, was Sie für jeden Eingabewert mit Ausnahme von 1.0 möchten.C hat keine eingebaute Min-Funktion, also müssen Sie Ihre eigene schreiben, wenn Sie es nicht schon getan haben. –
John, kam ich mit dem gleichen Ergebnis nach oben, nur nicht in der Lage war, es zu übertragen korrekt aus der Excel-Tabelle. Ich habe meine peinliche Antwort gelöscht. – cdonner