You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:07:47