... floor(x*log2(5))
x
が整数の100に1値があるので、様々なテストは、整数乗算を使用する「最良の」見つけるために作られたためにすることができますpower_of_2で割ります。
f(x) = x*a integer_divide power_of_2
f(x) = floor(x*log2(5)) = floor(x*some_float_c)
についてsome_float_c
の値は100、最小及び以下の最大値によって制限されます。
x f(x) mn mx
f(x)/x (f(x) + 1)/x
1 2 2.00000 3.00000
2 4 2.00000 2.50000
3 6 2.00000 2.33333
...
59 136 2.30508 2.32203
...
87 202 2.32184 2.33333
...
98 227 2.31633 2.32653
99 229 2.31313 2.32323
100 232 2.32000 2.33000
、最大minは2.32184
、最小最大の2.32203
です:
2.32184... <= some_float_c < 2.32203...
我々はfloat
を使用することはできませんので、some_integer/some_power_of_2
2.32184... <= some_integer/some_power_of_2 < 2.32203...
ceil(some_power_of_2 * 2.32184...) <= some_integer < floor(some_power_of_2 * 2.32203...)
min max
2.32184 2.32203
2 5 4
4 10 9
8 19 18
...
1024 2378 2377
2048 4756 4755
4096 9511 9511 < first one where min <= max
8192 19021 19022
見つけるので9511/4096
は "最も簡単" で、 「最良の」候補者である。
f(x) = (x*9511) integer_divide_by_power_of_2 4096
// In C
unsigned y = (x*9511u) >> 12;
5 ** xのビット数は、フロアではなく、天井(x * log2(5))です。 5 ** 1を格納するには3ビットが必要です。 –
私はそれが床(x * log2(5))+ 1だと思います。 編集:うん、私の右のように思える。 f(2)= f(3)は、floorを使用して1を加算すると動作しますが、ceilでは動作しません。 – Mercado
あなたは正しいと思います。 4はそれを格納するために3ビットを必要とする。 –