[0、1]の範囲の浮動小数点数があり、それを量子化して符号なしバイトに格納したいとします。当たり前のように聞こえますが、実際には非常に複雑です。
明らかな解決策は次のようになります。
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
これは、0から255までのすべての数値を取得するまでは機能しますが、整数の分布は均一ではありません。この関数は255
、aが正確にである場合にのみ戻ります1.0f
。良い解決策ではありません。
適切な丸めを行うと、問題がシフトします。
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
ここでは、結果0
は他のどの数値よりもフロート範囲の半分しかカバーしていません。
浮動小数点範囲を均等に分散して量子化するにはどうすればよいですか?理想的には、均等に分散されたランダムフロートを量子化する場合、整数の均等な分布を取得したいと思います。
何か案は?
ところで:また、私のコードはCにあり、問題は言語に依存しません。C以外の人の場合:変換することでフロートが切り捨てられると仮定しfloat
ます。int
編集:ここで混乱があったので:最小の入力float(0)を最小のunsigned charにマップし、範囲の最大のfloat(1.0f)を最大のunsignedバイト(255)にマップするマッピングが必要です。