Округленное деление на степень 2

Я реализую алгоритм квантования из учебника. Я нахожусь в точке, где все в значительной степени работает, за исключением того, что при округлении я получаю ошибки по одной. Вот что об этом говорится в учебнике:

Округленное деление на 2 ^ p может быть выполнено путем добавления смещения и сдвига вправо на p битовых позиций

Теперь я получил бит о сдвиге вправо, но о каком смещении они говорят?

Вот мой пример кода:

def scale(x, power2=16):
    if x < 0:
        return -((-x) >> power2)
    else:
        return x >> power2
def main():
    inp = [ 12595827, -330706, 196605, -387168, -274244, 377496, -241980, 
            -545272,  -196605, 24198,   196605,  193584, 104858, 424683,
            -40330,     41944 ]
    expect = [ 192, -5, 3, -6, -4, 5, -3, -8, -3, 0, 3, 3, 1, 6, 0, 0 ]
    actual = map(scale, inp)
    for i in range(len(expect)):
        if actual[i] == expect[i]:
            continue
        print 'inp: % 8d expected: % 3d actual: % 3d err: %d' % (inp[i], 
                expect[i], actual[i], expect[i] - actual[i])
if __name__ == '__main__':
    main()

Я проверяю ввод отрицательных значений, поскольку сдвиг битов на отрицательное целое число зависит от реализации.

Мой вывод :

inp:   196605 expected:   3 actual:   2 err: 1
inp:  -387168 expected:  -6 actual:  -5 err: -1
inp:  -196605 expected:  -3 actual:  -2 err: -1
inp:   196605 expected:   3 actual:   2 err: 1
inp:   193584 expected:   3 actual:   2 err: 1

Какое смещение упоминается в учебнике, и как я могу его использовать, чтобы избавиться от этой ошибки?

12
задан Lucky Murari 26 May 2011 в 07:57
поделиться