如何在 fxpmath 库中使用 pow()

How to use pow() in fxpmath library

我正在使用 fxpmath 库,但基本算术似乎不起作用。值是否已损坏或我是否使用了不应计算的权力?

from fxpmath import Fxp

def test_pure_q96():
    x = Fxp(1.0001, dtype="Q64.96") ** (Fxp(4055, dtype="Q64.96") / 2)

    print(x)
    print(x/2)

输出为:

1.2247538232335937
2.036149027162537e-13

第一个值好像是对的,第二个应该只有第一个的一半吧?

documentation 说:

The constant is converted into a new Fxp object before math operation, where the Fxp size for the constant operand is defined by x.config.op_input_size in examples above. The default value for op_input_size is 'best' (best enoguh precision to represent the constant value), but it could be used 'same' to force the constant's size equals to Fxp object size (x in the examples).

如果您输入 x.config.op_input_size,它会打印 'same' 而不是 'best'。因此,尝试通过输入 x.config.op_input_size='best'.

来更改配置

代码看起来像这样:

from fxpmath import Fxp

def test_pure_q96():
    x = Fxp(1.0001, dtype="Q64.96") ** (Fxp(4055, dtype="Q64.96") / 2)
    x.config.op_input_size='best'

    print(x)
    print(x/2)

详细答案在issue #38。以下为摘要:

power函数中使用小数(n_frac != 0)作为指数时op_sizing='optimal',fxpmath无法解析数量结果的小数位,因此它使用 float 执行幂计算,并将结果存储在 Fxp 中,大小为 最佳 。由于结果值为 1.2247538232335937(...),fxp-s54/52 (Q2.52) 的大小被认为是最佳的。

计算x/2时,常量2被取为一个大小相同的Fxp(见@Suneesh Jacob评论),2不能只用一位表示整数部分 (Q2.52)。这就是 x/2.

后值错误的原因

如果需要在 Q64.96 中执行 power 计算,请配置 fxpmath 以使用 op_sizing='same',这样结果的小数部分就知道了。

Fxp(1.0001, dtype="Q64.96", op_sizing='same')**(Fxp(4055/2))

exponent doesn't need to be Q64.96 necessarily.


您也可以使用模板以同样的精度工作:

Fxp.template = Fxp(dtype='Q64.96', op_sizing='same')

# since here all Fxp created without explicit size will be `Q64.96` with op_sizing='same'

z = Fxp(1.0001) # same that z = Fxp(1.0001, dtype="Q64.96", op_sizing='same')
# ...
z = Fxp(1.0001)**(Fxp(4055/2, dtype='Q16.2')) 
z.info(3)

Fxp.template = None # disable template