最友好的定点算法模拟python库

信息处理 Python 固定点
2022-02-18 13:38:00

我的主要编程语言是python。有人知道在 python 中模拟定点算法的可靠 python 库吗?一个快速的谷歌搜索揭示了这一点:

https://pypi.org/project/spfpm/

有人对此有经验吗?

1个回答

我尝试过的库是:

我专门寻找一个非调整大小的定点库。我针对签名的 16.16 对它们进行了一些简单的测试。一些运算符没有为某些库定义,结果是错误。每个操作的数据类型显示结果的表示。

from IPython.display import display, Markdown

介绍

  • 对于每个库显示固定点的简单和复合计算。
  • 显示具有 16 位小数精度的有符号 32 位值的构造。
  • 显示每个的最正值和最负值
bits = 32
int_bits = 16
frac_bits = bits-int_bits


def testbench(value, type_to_str_f=lambda x : str(type(x))):
    def display_result(result):
        try:
            normal_repr = float(result)
        except Exception as e:
            normal_repr = str(result)

        display(Markdown(f"+ Result: {repr(result)}\n+ float(result): {normal_repr}\n+ type(result): {type_to_str_f(result)}"))

    one = (value + 1)-value

    display(Markdown("### a"))
    display_result(value)

    # multiplication
    result = value * value
    display(Markdown("### a * a"))
    display_result(result)

    # division
    display(Markdown("### a / a"))
    try:
        result = value / value
        display_result(result)
    except Exception as e:
        display(Markdown(f"+ Result: {e}\n+ type(result): {type(e)}"))
    
    # addition
    result = value + value 
    display(Markdown("### a + a"))
    display_result(result)

    # subtraction
    result = value - value 
    display(Markdown("### a - a"))
    display_result(result)

    # power
    display(Markdown("### $a^{a}$"))
    try:
        result = value ** value
        display_result(result)
    except Exception as e:
        display(Markdown(f"+ Result: {e}\n+ type(result): {type(e)}"))

    # absolute value
    display(Markdown("### |a|"))
    try:
        result = abs(value)
        display_result(result)
    except Exception as e:
        display(Markdown(f"+ Result: {e}\n+ type(result): {type(e)}"))
    
    # most positive number
    display(Markdown("### Most Positive Value"))
    i = 1
    try:
        most_positive = one*((1<<(int_bits-1))-i)
        display_result(most_positive)
    except Exception as e:
        display(e, type(e))
        
    
    # positive overflow
    display(Markdown("### Most Positive Value + 1"))
    try:
        result = most_positive + 1
        display_result(result)

    except Exception as e:
        display(Markdown(f"+ Result: {e}\n+ type(result): {type(e)}"))
    
    # most negative
    display(Markdown("### Most Negative Value"))
    try:
        most_negative = -one*((1<<(int_bits-1))-1) -1
        display_result(most_negative)
    except Exception as e:
        display(e, type(e))

    # negative overflow
    display(Markdown("### Most Negative Value - 1"))
    try:
        result = most_negative - 1
        display_result(result)

    except Exception as e:
        display(Markdown(f"+ Result: {e}\n+ type(result): {type(e)}"))

spfpm

from FixedPoint import FXfamily, FXnum

# data type is called "family"
family = FXfamily(n_bits=frac_bits, n_intbits=int_bits)

# construct
value = FXnum(-3, family=family)
testbench(value, type_to_str_f=lambda x: f"{value.family}")

一种

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=-196608)
  • 浮动(结果):-3.0
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

一个*一个

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=589824)
  • 浮动(结果):9.0
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

一个/一个

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=65535)
  • 浮动(结果):0.9999847412109375
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

一个+一个

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=-393216)
  • 浮动(结果):-6.​​0
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

一个 - 一个

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=0)
  • 浮动(结果):0.0
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

aa

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=-2428)
  • 浮动(结果):-0.03704833984375
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

|一个|

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=196608)
  • 浮动(结果):3.0
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

最积极的价值

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=2147418112)
  • 浮动(结果):32767.0
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

最正值 + 1

  • 结果:
  • 类型(结果):<class 'FixedPoint.FXoverflowError'>

最负值

  • 结果:FXnum(family=FXfamily(n_bits=16, n_intbits=16), scaled_value=-2147483648)
  • 浮动(结果):-32768.0
  • 类型(结果):FXfamily(n_bits=16,n_intbits=16)

最负值 - 1

  • 结果:
  • 类型(结果):<class 'FixedPoint.FXoverflowError'>

fp二进制

from fpbinary import FpBinary

# construct
value = FpBinary(int_bits=int_bits, frac_bits=frac_bits, signed=True, value=-3)
testbench(value, type_to_str_f=lambda x: f"{x.format}")

一种

  • 结果:-3.0
  • 浮动(结果):-3.0
  • 类型(结果):(16、16)

一个*一个

  • 结果:9.0
  • 浮动(结果):9.0
  • 类型(结果):(32、32)

一个/一个

  • 结果:1.0
  • 浮动(结果):1.0
  • 类型(结果):(33、32)

一个+一个

  • 结果:-6.0
  • 浮动(结果):-6.​​0
  • 类型(结果):(17、16)

一个 - 一个

  • 结果:0.0
  • 浮动(结果):0.0
  • 类型(结果):(17、16)

aa

  • 结果:** 或 pow() 不支持的操作数类型:“fpbinary.FpBinary”和“fpbinary.FpBinary”
  • 类型(结果):<class 'TypeError'>

|一个|

  • 结果:3.0
  • 浮动(结果):3.0
  • 类型(结果):(17、16)

最积极的价值

  • 结果:32767.0
  • 浮动(结果):32767.0
  • 类型(结果):(34、16)

最正值 + 1

  • 结果:32768.0
  • 浮动(结果):32768.0
  • 类型(结果):(35、16)

最负值

  • 结果:-32768.0
  • 浮动(结果):-32768.0
  • 类型(结果):(36、16)

最负值 - 1

  • 结果:-32769.0
  • 浮动(结果):-32769.0
  • 类型(结果):(37、16)

fxpmath

from fxpmath import Fxp
# construct
value = Fxp(val=-3, dtype=f'fxp-s{bits}/{frac_bits}', rounding="fix", Shifting="trunc")
testbench(value, type_to_str_f=lambda x: f"{x.dtype}")

一种

  • 结果:fxp-s32/16(-3.0)
  • 浮动(结果):-3.0
  • 类型(结果):fxp-s32/16

一个*一个

  • 结果:fxp-s64/32(9.0)
  • 浮动(结果):9.0
  • 类型(结果):fxp-s64/32

一个/一个

  • 结果:fxp-s64/31(1.0)
  • 浮动(结果):1.0
  • 类型(结果):fxp-s64/31

一个+一个

  • 结果:fxp-s33/16(-6.0)
  • 浮动(结果):-6.​​0
  • 类型(结果):fxp-s33/16

一个 - 一个

  • 结果:fxp-s33/16(0.0)
  • 浮动(结果):0.0
  • 类型(结果):fxp-s33/16

aa

  • 结果:fxp-s53/52(-0.03703703703703698)
  • 浮动(结果):-0.03703703703703698
  • 类型(结果):fxp-s53/52

|一个|

  • 结果:abs() 的操作数类型错误:'Fxp'
  • 类型(结果):<class 'TypeError'>

最积极的价值

  • 结果:fxp-s33/16(32767.0)
  • 浮动(结果):32767.0
  • 类型(结果):fxp-s33/16

最正值 + 1

  • 结果:fxp-s33/16(32768.0)
  • 浮动(结果):32768.0
  • 类型(结果):fxp-s33/16

最负值

  • 结果:fxp-s33/16(-32768.0)
  • 浮动(结果):-32768.0
  • 类型(结果):fxp-s33/16

最负值 - 1

  • 结果:fxp-s33/16(-32769.0)
  • 浮动(结果):-32769.0
  • 类型(结果):fxp-s33/16

努菲

from numfi import numfi

# construct
value = numfi(-3, s=True, w=bits, f=frac_bits, rounding='round', overflow='wrap', fixed=True)
testbench(value, type_to_str_f=lambda x: f"{repr(x)}")

一种

  • 结果:numfi([-3.]) s32/16-r/w
  • 浮动(结果):-3.0
  • 类型(结果):numfi([-3.]) s32/16-r/w

一个*一个

  • 结果:numfi([9.]) s32/16-r/w
  • 浮动(结果):9.0
  • 类型(结果):numfi([9.])s32/16-r/w

一个/一个

  • 结果:numfi([1.]) s32/16-r/w
  • 浮动(结果):1.0
  • 类型(结果):numfi([1.])s32/16-r/w

一个+一个

  • 结果:numfi([-6.]) s32/16-r/w
  • 浮动(结果):-6.​​0
  • 类型(结果):numfi([-6.]) s32/16-r/w

一个 - 一个

  • 结果:numfi([0.]) s32/16-r/w
  • 浮动(结果):0.0
  • 类型(结果):numfi([0.])s32/16-r/w

aa

  • 结果:numfi([-0.03703308]) s32/16-r/w
  • 浮动(结果):-0.037037037037037035
  • 类型(结果):numfi([-0.03703308])s32/16-r/w

|一个|

  • 结果:numfi([3.]) s32/16-r/w
  • 浮动(结果):3.0
  • 类型(结果):numfi([3.])s32/16-r/w

最积极的价值

  • 结果:numfi([32767.]) s32/16-r/w
  • 浮动(结果):32767.0
  • 类型(结果):numfi([32767.])s32/16-r/w

最正值 + 1

  • 结果:numfi([-32768.]) s32/16-r/w
  • 浮动(结果):-32768.0
  • 类型(结果):numfi([-32768.])s32/16-r/w

最负值

  • 结果:numfi([-32768.]) s32/16-r/w
  • 浮动(结果):-32768.0
  • 类型(结果):numfi([-32768.])s32/16-r/w

最负值 - 1

  • 结果:numfi([32767.]) s32/16-r/w
  • 浮动(结果):32767.0
  • 类型(结果):numfi([32767.])s32/16-r/w

固定点

from fixedpoint.fixedpoint import FixedPoint
# construct
value = FixedPoint(-3, signed=True, m=int_bits, n=frac_bits, overflow='wrap', rounding='auto')
testbench(value, type_to_str_f=lambda x: f"{repr(x)}")

一种

  • 结果: FixedPoint('0xfffd0000', signed=1, m=16, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):-3.0
  • 类型(结果):定点('0xfffd0000',有符号=1,m=16,n=16,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

一个*一个

  • 结果: FixedPoint('0x900000000', signed=1, m=32, n=32, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):9.0
  • 类型(结果):定点('0x900000000',有符号=1,m=32,n=32,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

一个/一个

  • 结果:/:“FixedPoint”和“FixedPoint”不受支持的操作数类型
  • 类型(结果):<class 'TypeError'>

一个+一个

  • 结果: FixedPoint('0x1fffa0000', signed=1, m=17, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):-6.​​0
  • 类型(结果):FixedPoint('0x1fffa0000',有符号=1,m=17,n=16,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

一个 - 一个

  • 结果: FixedPoint('0x0', signed=1, m=17, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):0.0
  • 类型(结果):FixedPoint('0x0',signed=1,m=17,n=16,overflow='wrap',rounding='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

aa

  • 结果:取幂只支持正整数。
  • 类型(结果):<class 'TypeError'>

|一个|

  • 结果: FixedPoint('0x30000', signed=1, m=16, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):3.0
  • 类型(结果):FixedPoint('0x30000',有符号=1,m=16,n=16,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

最积极的价值

  • 结果: FixedPoint('0x7fff0000', signed=1, m=33, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):32767.0
  • 类型(结果):定点('0x7fff0000',有符号=1,m=33,n=16,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

最正值 + 1

  • 结果: FixedPoint('0x80000000', signed=1, m=34, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):32768.0
  • 类型(结果):定点('0x80000000',有符号=1,m=34,n=16,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

最负值

  • 结果: FixedPoint('0x3ffff80000000', signed=1, m=34, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):-32768.0
  • 类型(结果):FixedPoint('0x3ffff80000000',有符号=1,m=34,n=16,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

最负值 - 1

  • 结果: FixedPoint('0x7ffff7fff0000', signed=1, m=35, n=16, overflow='wrap', rounding='convergent', overflow_alert='error', mismatch_alert='warning', implicit_cast_alert='warning', str_base=16)
  • 浮动(结果):-32769.0
  • 类型(结果):定点('0x7ffff7fff0000',有符号=1,m=35,n=16,溢出='wrap',舍入='convergent',overflow_alert='error',mismatch_alert='warning',implicit_cast_alert='警告',str_base=16)

定点测试

  • 网址:https ://github.com/sixty-north/fixedpointtest
  • 项目名称:fixedpointtest
  • 包名:定点
  • 注意:可变大小。相同的包名称 Schweitzer-Engineering-Laboratories/fixedpoint。我将 setup.py 中的包名称更改为 fixedpoint2 以使它们共存。
from fixedpoint2 import FixedPoint, QFormat
value = FixedPoint(-3, qformat=QFormat(integer_bits=int_bits, fraction_bits=frac_bits))
testbench(value, type_to_str_f=lambda x: f"{repr(x)}")

一种

  • 结果: FixedPoint(-3, QFormat(16, 16))
  • 浮动(结果):-3.0
  • 类型(结果): FixedPoint(-3, QFormat(16, 16))

一个*一个

  • 结果: FixedPoint(9, QFormat(33, 32))
  • 浮动(结果):9.0
  • 类型(结果): FixedPoint(9, QFormat(33, 32))

一个/一个

  • 结果: FixedPoint(1, QFormat(33, 32))
  • 浮动(结果):1.0
  • 类型(结果):定点(1,QFormat(33、32))

一个+一个

  • 结果:FixedPoint(-6, QFormat(17, 16))
  • 浮动(结果):-6.​​0
  • 类型(结果): FixedPoint(-6, QFormat(17, 16))

一个 - 一个

  • 结果: FixedPoint(0, QFormat(18, 16))
  • 浮动(结果):0.0
  • 类型(结果): FixedPoint(0, QFormat(18, 16))

aa

  • 结果: FixedPoint(0.037037037037038089692941866815090179443359375, QFormat(51, 46))
  • 浮动(结果):-0.03703703703703809
  • 类型(结果): FixedPoint(0.037037037037038089692941866815090179443359375, QFormat(51, 46))

|一个|

  • 结果: FixedPoint(3, QFormat(16, 16))
  • 浮动(结果):3.0
  • 类型(结果): FixedPoint(3, QFormat(16, 16))

最积极的价值

  • 结果:定点(32767,QFormat(35、16))
  • 浮动(结果):32767.0
  • 类型(结果):定点(32767,QFormat(35、16))

最正值 + 1

  • 结果: FixedPoint(32768, QFormat(36, 16))
  • 浮动(结果):32768.0
  • 类型(结果): FixedPoint(32768, QFormat(36, 16))

最负值

  • 结果:FixedPoint(-32768, QFormat(37, 16))
  • 浮动(结果):-32768.0
  • 类型(结果): FixedPoint(-32768, QFormat(37, 16))

最负值 - 1

  • 结果: FixedPoint(-32769, QFormat(38, 16))
  • 浮动(结果):-32769.0
  • 类型(结果): FixedPoint(-32769, QFormat(38, 16))

其他图书馆