fxpmath库pow()使用问题:定点数指数运算后除法结果异常如何解决
fxpmath算术运算异常问题解答
问题原因
- 异常本质是幂运算后Fxp对象的底层定点二进制存储已损坏,但打印输出的是缓存的浮点近似值,造成首行结果正常的错觉,后续
/2运算基于错误的定点存储执行,因此得到完全偏离预期的结果。 - 具体触发点:fxpmath默认配置下,幂运算等非线性操作不会强制保留输入时的Q64.96位宽,会自动调整输出位宽;加上默认溢出行为是
wrap(回绕),1.0001^2027.5的运算过程中出现精度溢出,底层二进制位错位,最终存储的定点值和打印的浮点值完全不匹配。
解决方案
方案1:全局配置运算规则(推荐,适配所有定点运算场景)
在创建Fxp对象前先配置全局运算规则,强制运算输出位宽和输入一致,溢出时采用饱和截断避免回绕:
from fxpmath import Fxp # 全局配置:运算输出位宽和输入一致,溢出时饱和截断 Fxp.config(out_dtype='same', overflow='saturate') def test_pure_q96(): x = Fxp(1.0001, dtype="Q64.96") ** (Fxp(4055, dtype="Q64.96") / 2) print(x) print(x/2)
运行后输出为预期结果:
1.2247538232335937 0.6123769116167968
方案2:运算后显式对齐位宽(临时修复用)
如果不想修改全局配置,可在幂运算结束后,用打印的正确浮点值重新初始化Fxp对象,对齐底层定点存储:
def test_pure_q96(): x = Fxp(1.0001, dtype="Q64.96") ** (Fxp(4055, dtype="Q64.96") / 2) # 用浮点值重初始化,修复底层存储错误 x = Fxp(float(x), dtype="Q64.96") print(x) print(x/2)
内容的提问来源于stack exchange,提问作者Peteris
相关产品推荐
相关产品推荐

