Q(4,20)格式有符号分数乘法结果不符问题求助
Q(4,20)有符号分数乘法结果不符的问题分析
你的问题核心是直接用无符号整数处理补码形式的有符号数,右移时未执行算术右移(符号扩展),导致符号位丢失,结果错误。
问题根源
Q(4,20)是24位有符号定点数,你输出的十六进制值是补码形式:
0xFFF3B7是-0.003的补码,作为无符号整数是16774071,但实际表示的是负数(0xFFF3B7 - 2^24 = -25779)。- Python的
>>运算符对无符号正数是逻辑右移(高位补0),但有符号数的补码乘法后需要**算术右移(高位补符号位)**才能得到正确结果。你直接用无符号整数相乘再右移,相当于把负数当成了大正数计算,结果自然错误。
正确验证步骤
把补码转为有符号整数后再计算:
# 把Q(4,20)补码转为Python有符号整数 a = 0xFFF3B7 - 2**24 # -25779,对应-0.003 b = 0x0B4FDF # 745439,对应0.707 # 相乘后算术右移20位 result = (a * b) >> 20 # -2096 # 把结果转回24位补码 hex_result = hex(result + 2**24 if result < 0 else result) print(hex_result) # 输出0xfff750,与预期一致
更简便的方法:用fxpmath自带乘法
直接使用fxpmath的对象乘法,库会自动处理有符号数的算术运算和移位:
from fxpmath import Fxp x = Fxp(-0.003, signed=True, n_word=24, n_frac=20) y = Fxp(0.707, signed=True, n_word=24, n_frac=20) z = x * y # 自动完成乘法和移位 print(z.hex()) # 输出0xfff750
内容的提问来源于stack exchange,提问作者user2532296
相关产品推荐
相关产品推荐

