我尝试过的库是:
我专门寻找一个非调整大小的定点库。我针对签名的 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)
一种一种
- 结果: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)
一种一种
- 结果:** 或 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)
定点测试
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))
其他图书馆