四舍五入除以2的幂
|
我正在从教科书中实现量化算法。我的工作很正常,除了四舍五入时出现一个错误。这是教科书必须说的:
可以通过将偏移量和右移p位位置来对“ 0”进行舍入除法
现在,我对正确的转变有所了解,但是他们在谈论什么偏移呢?
这是我的示例代码:
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
教科书中提到的偏移量是多少,如何使用它来消除此错误?
没有找到相关结果
已邀请:
4 个回复
目浆搽
要进行正确的舍入,您需要在进行移位之前添加一半的除数。
视蕉梁拌客
在您的代码中:
舞备联
但是我们得到以下错误:
通过计算舍入取整的正确结果,我们可以确认这些期望实际上是错误的:
因此,如果您真正想要的是四舍五入的除法,则期望值列表应为:
骇毖煽洁铂
因此,下降得到8分中的6分,最接近得到5分,上升仅2分。 什么教科书?现在是“名字\'n \'耻辱”的时间! 经过进一步实验后更新: 如果在将截断除以65536之前添加了8192,则会得到“预期”结果。 (512,...,32768)中的2的其他幂没有相同的效果。 将其描述为增加偏移量以使向下取整偏向有点不幸。 重写:该对象将四舍五入为NEAREST整数,但会偏向零(较小的绝对整数)。四舍五入到最接近的值可以通过在截断除法之前加32768来完成。使用比32768小的“偏移”可获得所需的偏置效果。如果偏移量是2的幂,例如2 ** k,则可以通过以下方式完成:移位k位,加1,移位16-k位。