【问题标题】:How to use pow() in fxpmath library如何在 fxpmath 库中使用 pow()
【发布时间】:2021-08-20 14:19:14
【问题描述】:

我正在使用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

第一个值似乎正确,第二个应该只有第一个的一半?

【问题讨论】:

  • 打印出x.info(verbose=3) 可能会提供有用的信息,以准确了解该结果是如何表示的。我不确定Q64.96 是一个可用的 dtype,因为它要求底层存储是 128 位 int,而 numpy 似乎不支持。
  • 还有其他可用的 Qx.96 类型吗?可能是一个更大的整数?
  • 我认为您会将总位数限制为 64 - 所以Q2.62 将是您可以针对此特定值获得的最精确的值。 (您无法使用该 dtype 表示 4055 常量,但您不需要。)
  • 超级有用,看来我需要为 Q64.96 找到另一个库,因为我需要模拟这种确切的行为!

标签: python fixed-point


【解决方案1】:

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

当在power 函数和op_sizing='optimal' 中使用小数(n_frac != 0)作为指数时,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))

指数不一定是Q64.96


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

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

【讨论】:

    【解决方案2】:

    documentation 说:

    常量在数学运算之前被转换为一个新的 Fxp 对象,其中常量操作数的 Fxp 大小由上面示例中的 x.config.op_input_size 定义。 op_input_size 的默认值为 'best'(表示常量值的最佳 enoguh 精度),但可以使用 'same' 来强制常量的大小等于 Fxp 对象大小(示例中为 x)。

    如果您输入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)
    

    【讨论】:

    • fxpmath 有运算符重载github.com/francof2a/fxpmath#arithmetic。运算符重载允许您使用与您自己的类的内置类型相同的运算符!这很棒,您可以在此处了解有关 Python 中运算符重载的更多信息:programiz.com/python-programming/operator-overloading
    • @Peteris 如果您输入x.config.op_input_size,它将打印'same' 而不是'best'。因此,尝试输入x.config.op_input_size='best' 更改配置,现在尝试print(x/2),它会打印0.6123769116167967
    • 很好,这对我来说似乎更像是一种破解/解决方法,因为这样你就必须在每次使用常量的操作之后使用x.config.op_input_size='best'。同样在文档中,默认值意味着“最佳”,但在这里我们看到默认值是“相同”。
    • 见@jasonharper 评论 - 这很可能是一个黑客。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多