Извлечение мантиссы и экспоненты с плавающей запятой в NumPy

Я хотел бы иметь возможность извлекать значение и показатель числа с плавающей запятой в NumPy. Получение показателя степени в виде целого числа прекрасно и нормально для мантиссы. Получение мантиссы в виде битового поля было бы еще более удобным.

Я знаю, что поплавки Python имеют метод 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'

Извлечение показателя степени и знака таким образом неудобно, так как начальные 0 отбрасываются на bin. (Хотя я мог бы добавить 0 к 32 битам влево…)

В любом случае, поскольку bin не является ufunc, это не удобно и мне пришлось бы перебирать массив.

Нет ли более удобного способа делать то, что я хочу?


person equaeghe    schedule 07.09.2017    source источник
comment
Взгляните на этот ответ, он может указать вам правильное направление   -  person GPhilo    schedule 07.09.2017
comment
@GPhilo: Спасибо. На самом деле, этот ответ, кажется, ясно дает понять, что нет более удобного подхода.   -  person equaeghe    schedule 07.09.2017
comment
Взгляните на numpy.frexp.   -  person Mark Dickinson    schedule 07.09.2017
comment
@MarkDickinson: numpy.frexp дает a разложение на экспоненту и мантиссу, а не разложение на экспоненту и мантиссу, закодированную в IEEE 754 с плавающей запятой. (Показатель, заданный frexp, отличается на единицу от показателя с плавающей запятой IEEE 754.)   -  person equaeghe    schedule 07.09.2017
comment
@equaeghe: Да, но перейти от результата frexp к разложению IEEE 754 тривиально. Как вы говорите, показатель степени отличается на единицу, поэтому вычтите единицу из показателя степени и удвойте мантиссу.   -  person Mark Dickinson    schedule 08.09.2017
comment
@MarkDickinson: Верно, но мне все равно нужно отдельно извлечь мантиссу. Я не понимаю, как я мог бы сделать все шаги короче, чем в моем ответе самому себе. Возможно, вы можете добавить ответ, чтобы я проголосовал за него?   -  person equaeghe    schedule 08.09.2017


Ответы (1)