在NumPy中提取浮点有效数和指数

时间:2017-09-07 09:45:32

标签: python numpy floating-point exponent significant-digits

我希望能够在NumPy中提取浮点数的有效数和指数。将指数作为整数获得很好并且对于有效数字是可以的。将有效数字视为一个位域将更加方便。

我知道Python浮动有一个hex方法;但是,我希望使用numpy.float32,numpy数组和ufuncs。我也知道numpy view方法,它允许我将float看作一个整数,从而看作二进制字符串:

>>> import numpy as np

>>> b = bin(np.float32(1.23456789).view(np.int32))
'0b111111100111100000011001010010'

>>> b[-23:] # extract last 23 bits of IEEE 754 binary32 float, is significand
'00111100000011001010010'

提取指数并以这种方式签名并不方便,因为前导0被bin删除。 (虽然我可以将左边焊盘保留为32位,但是为0 ...)

在任何情况下,因为bin不是ufunc,这不方便,我不得不迭代数组。

还没有更方便的方法来做我想要的事情吗?

1 个答案:

答案 0 :(得分:1)

GPhilio的评论引发了对SO的更彻底的搜索,导致以下解决方案基于an answer to “extracting mantissa and exponent from double in c#”

import numpy as np

def decompose(x: np.float32): 
    """decomposes a float32 into negative, exponent, and significand"""
    negative = x < 0
    n = np.abs(x).view(np.int32) # discard sign (MSB now 0),
                                 # view bit string as int32
    exponent = (n >> 23) - 127 # drop significand, correct exponent offset
                               # 23 and 127 are specific to float32
    significand = n & np.int32(2**23 - 1) # second factor provides mask
                                          # to extract significand
    return (negative, exponent, significand)

这种使用整数的位级操作的方法实际上更方便的是转到实际的位串本身。