Я реализую алгоритм квантования из учебника.Я нахожусь в точке, где все работает довольно хорошо, за исключением случаев, когда при округлении возникают ошибки.Об этом говорится в учебнике:
Округленное деление на 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
Что такое смещение, упомянутое в учебнике, и как я могу использовать его, чтобы избавиться от этогоошибка?