gpt4 book ai didi

python - 四舍五入除以 2 的幂

转载 作者:太空狗 更新时间:2023-10-29 17:46:12 25 4
gpt4 key购买 nike

我正在实现教科书中的量化算法。我正处在一个可以正常工作的地步,除了我在四舍五入时遇到了小数错误。教科书对此是这样说的:

Rounded division by 2^p may be carried out by adding an offset and right-shifting by p bit positions

现在,我了解了右移,但他们在谈论什么偏移量?

这是我的示例代码:

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

教科书中提到的偏移量是多少,我如何使用它来消除这个错误?

最佳答案

类次将被截断。移位是一个二元操作符。我在这里使用方括号表示基数:

196605[10] = 101111111111111111[2]
101111111111111111[2] >> 16[10] = 10[2] = 2[10]

要执行正确的舍入,您需要在进行移位之前加上除数的一半。

101111111111111111[2] + 1000000000000000[2] >> 16[10] = 110111111111111111[2] >> 16[10] = 11[2] = 3[10]

关于python - 四舍五入除以 2 的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6135157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com