【问题标题】:Custom binary representation of fixed point number定点数的自定义二进制表示
【发布时间】:2017-04-05 09:37:39
【问题描述】:

有没有办法在 Python 中获取数字的二进制表示?它还必须能够表示负数。我已经尝试过 numpy np.binary_repr(Decimal(-1)) 中的函数,但它会导致错误。准确地说 - 我想以某种方式获得定点数(正数和负数)的二进制表示,因此我可以将它们放入 Verilog 代码中。

假设我有十进制数字1,5。我想用两位精度和三个整数位和一个符号来编写它。在二进制中,这将是0001,10,所以基本上是000110。我可以手动轻松完成此操作,但问题是我也有负数,而且它们在该点之后没有有限扩展(如十进制的1/3

更准确地说:如果我有一个像 -1.5 这样的数字,十进制一个符号,小数精度为 2,整数精度为 2,我希望数字 110,10 是输出 - 第一个数字是符号,后面两个是数字,后面两个是分数。

【问题讨论】:

  • 很有趣,但你能告诉我们输入和预期输出吗? Verilog 与 python 内部数字表示有什么关系?我认为您想改为“模拟” Verilog 代码预期的数字表示。
  • 这与 python 的内部数字表示无关。假设我有十进制数字1,5。我想用两位精度和三个整数位和一个符号来编写它。在二进制中,这将是0001,10,所以基本上是000110。我可以手动轻松地做到这一点,但问题是我也有负数,而且它们在点之后没有有限扩展(如十进制的1/3)。
  • Float to binary的可能重复
  • @kamik423 不,这里是定点而不是浮点。

标签: python-3.x binary fixed-point


【解决方案1】:

bin(number) 可能是您正在寻找的功能。它支持负数,但格式有些特殊

>>> bin(4)
'0b100'
>>> bin(-3)
'-0b11'
>>> bin(10000000)
'0b100110001001011010000000'

您可以构建这样的东西来将其转换为更常见的符号:

def binary(number):
    b = bin(number)
    if b[0] == '-':
        return '-' + b[3:]
    else:
        return b[2:]

【讨论】:

    【解决方案2】:

    您可以通过numfi等各种定点算术库创建定点数

    >>> from numfi import numfi  
    >>> x = numfi(-1.5,1,5,2) 
    >>> x.bin  
    array(['11010'], dtype='<U5')
    >>> x.bin_
    array(['110.10'], dtype='<U6')
    

    但如果您只需要将单个十进制数转换为固定长度的二进制表示并且没有算术运算,则可以使用np.binary_repr(x,width)

    np.binary_repr(np.round(num*(2**f)).astype(int), width=w) 
    # num=-1.5, f=2, w=5 (2 fraction, 2 integer, 1 signed) for your example
    

    你可以用np.floor/np.ceil/.astype(int)替换np.round,用于不同的舍入方法

    【讨论】:

      【解决方案3】:

      我为此推荐 fxpmath 模块。

      repo 网址是:https://github.com/francof2a/fxpmath

      from fxpmath import Fxp
      
      x = Fxp(-1.5, True, 5, 2)   # (val, signed, n_word, n_frac)
      
      print(x.bin())
      

      结果:

      11010
      

      【讨论】:

        【解决方案4】:

        您可以使用Binary fractions 包。使用此包,您可以将二进制分数字符串转换为浮点数,反之亦然。

        例子:

        >>> from binary_fractions import Binary
        >>> str(Binary(-1.5))
        '-0b1.1'
        >>> float(Binary("-1.1"))
        -1.5
        

        它有更多的辅助函数来操作二进制字符串,例如:shift、add、fill、to_exponential、invert...

        PS:无耻插件,我是这个包的作者。

        【讨论】:

          猜你喜欢
          • 2020-12-05
          • 1970-01-01
          • 1970-01-01
          • 2017-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-29
          相关资源
          最近更新 更多