我希望能够在numpy中提取浮点数的显着性和指数。将指数作为整数可以很好,对于显着性而言是可以的。将其作为比特菲尔德的显着性更具说服力。
我知道Python Floats具有hex
方法;但是,我希望使用numpy.float32
,Numpy数组和UFUNCS。我还知道Numpy view
方法,它使我可以将浮子视为整数,从而将浮子视为二进制字符串:
>>> 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'
以这种方式提取指数并签名并不方便,因为 bin
删除了领先0。(我可以用0左右拿到32位……)
无论如何,由于 bin
不是ufunc,所以这不是方便的,我必须在数组上迭代。
没有其他方便的方法来做我想要的事情吗?
gphilio的评论触发了一个更彻底的搜索,因此,基于"从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)
这种使用整数的位级操作的方法实际上更方便地转到实际的斑点本身。