/クオンタイズフロート範囲は、整数の範囲に変換します
-
11-09-2019 - |
質問
私は[0、1]の範囲内のフロートを持っていると私は量子化及び符号なしバイトで、それを保存したいと言います。誰でも思いつきそうのように聞こえるが、実際には、それは非常に複雑です。
明白な解決策は、次のようになります:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
これはこれまでのところ、私は0から255までのすべての数字を取得することで動作しますが、整数の分布はさえません。まさに255
ある場合、関数はのみ1.0f
を返します。ない良い解決策ます。
私は適切な丸め処理を行う場合、私はちょうど問題をシフトます:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
ここ結果0
のみ、他の数よりもフロート範囲の半分をカバーしています。
私は浮動小数点の範囲の均等分布と量子化をどのように行うのですか?理想的には私は私が均等に分布するランダムな浮動小数点数を量子化する場合は、整数の平等な分配を取得したいと思います。
任意のアイデア?
<時間>ところで:また、私のコードは、問題は、言語に依存しないでCです。 C以外の人々のために:ちょうど変換はフロートを切り捨てfloat
することint
を前提と
の編集:私たちはここにいくつかの混乱があったのでの:私は(0)最小unsigned char型への最小入力フロートをマッピングするマッピング、および私の範囲(1.0F)の最高フロートにする必要があります最高の符号なしバイト(255)。
解決
どのようにチェックしてa * 256f
約255から256を削減するには?だから、何かます:
return (unsigned char) (min(255, (int) (a * 256f)));
(お使いのプラットフォームに適したmin関数について - 。私はそれのためのC関数を思い出すことができません)
基本的にはそれが何をすべきかである256等分、に範囲を分割したいです。 1.0は256に行くと切り捨てが必要なため、エッジの場合は、ドメインの両端で包括的であるという理由だけです。
他のヒント
私は、あなたが探していることはこれだと思います:
unsigned char QuantizeFloat (float a)
{
return (unsigned char) (a * 256.0f);
}
これは[0、255]に均一バイト値を[0,1]に均一な浮動小数点値をマップします。 [I / 256のすべての値、(I + 1)/ 256 [(つまり、(I + 1)/ 256を除いている)は、I 0 255で、私にマッピングされます。どのような望ましくないかもしれませんが1.0Fが0にラップアラウンド256.0fにマッピングされているということです。