fxpmath:无符号数相减获有符号结果的最优实现方案
解决方案
问题原因:无符号Fxp类型执行减法时,若结果为负会触发无符号溢出,最终被截断为0,这是无符号数值类型的固有行为。以下是几种无需修改原变量类型的优化实现方式:
方案1:直接操作底层raw值计算
利用fxpmath的raw属性获取无符号数的底层整数表示,直接计算差值后赋值给有符号结果的raw属性,绕过无符号溢出限制:
import numpy as np from fxpmath import Fxp as fxp t1 = fxp(4, False, 9, 3) t2 = fxp(5, False, 9, 3) inter1 = fxp(0, True, 9, 3, raw=True) # 直接计算底层raw值的差值并赋值 inter1.raw = t1.raw - t2.raw print(inter1) # 输出:-1.00
方案2:临时转为有符号类型计算
临时将原无符号变量转为有符号类型(不修改原变量),执行减法后存入有符号结果:
# 临时转换为有符号类型,原变量保持不变 t1_temp = t1.astype(signed=True) t2_temp = t2.astype(signed=True) inter1(t1_temp - t2_temp) print(inter1) # 输出:-1.00
方案3:手动判断大小处理
通过比较数值大小,分别处理正负差值,避免无符号溢出:
if t1 >= t2: inter1(t1 - t2) else: # 计算正数差值后取负,赋值给有符号结果 inter1(-(t2 - t1).get_val()) print(inter1) # 输出:-1.00
其中方案1为最优选择,直接操作底层数值,无需额外类型转换或条件判断,效率最高且满足你不修改原变量类型的需求。
内容的提问来源于stack exchange,提问作者Lucien Pruvot
相关产品推荐
相关产品推荐

