1

この質問で丸め手法について読みました。 色の値を float 0..1 からバイト 0..255 に変換する

0 から 1 の範囲に float があり、それを 0 から 255 のバイト整数範囲にマップしたいとします。したがって、0 ~ 1 の数値に 255f を掛けてから、その数値をバイトに変換します。すべての変換は float の小数部分を単に床にするだけなので、床を敷いたときに目的の丸め結果が得られるようにする方法が必要です。

私の考えは、バイトに変換される前に 0.5f を追加することです。

しかし、私がリンクしたそのページで、私が理解していないことに気づきました。彼は代わりに 0-1 を 256 にマップし、これにより何らかの方法で丸められた結果が得られます。

値をテストして、機能するかどうかを確認しました。理由がわかりません。誰か証拠を見せてくれませんか?

4

2 に答える 2

4

Fencepost エラーの特殊なケースです。最も簡単な説明は、黒と白の 2 色しかない場合です。したがって、間隔 0-1 を2で割る必要があることは簡単にわかります。

これは、間隔にわずかに少ない除算数を掛けて、結果を切り捨てることで簡単に実現できます。これは、乱数ジェネレーターが値 >= 0 および < 1.0 を返し、同じ確率で値を簡単に取得する理由でもあります。

したがって、この例では、値 = floorf(1.9999*x) で正しい結果が得られます。

問題は、カラー インデックスが数字の 1 で終わる一方で、実際には 2 つの色 (0 と 1) があるため、間隔を 2 で割る必要があることです。したがって、256 色 (0 ~ 255) の場合は、256 で割る必要があります。人々は、0 も有効な値であり、正しくマッピングする必要があることに気付く可能性があります。

于 2013-04-15T17:08:03.743 に答える
2

簡単に言えば、整数「0、1、2、3」で色を表す場合、0.5 ケースになるものを選択する必要があります。1 を選択すると、0.0、0.5、0.75、1.0 になります。2 を選択すると、0.0、0.25、0.5、1.0 になります。これらの間隔を等しくする方法はありませんが、整数色には小数を含めることはできません。唯一の解決策は、0.5 のケースを完全に排除し、0.333 0.666 の等間隔を使用することですが、彼らはそうしないことを選択しました。したがって、カラー 127/255 は現在、0.498 ではなく 0.5 と評価されます。これは、128/256 と見なされるためです。残念ながら、分子と分母に 1 を追加すると、色 0 が 0/255 ではなく 1/256 として解釈されます。

于 2014-09-05T12:26:01.343 に答える