numpy.frexp

numpy.frexp(x, *ufunc_args) = <ufunc 'frexp'>

Функция frexp() выполняет разложение элементов массива на мантиссу и степень двойки.

Параметры:
x - число, массив или подобный массиву объект
Входной массив.
*ufunc_args - аргументы универсальной функции
Аргументы, позволяющие настроить и оптимизировать работу функции (подробнее см. универсальные функции).
Возвращает:
результат - кортеж из двух чисел или двух массивов NumPy
Первый массив содержит значения в интервале (-1, 1), т.е. мантиссу каждого элемента из x, второй массив содержит соответствующую степень двойки. Если на вход подано только одно число, то результатом будет кортеж из двух чисел.
Смотрите так же: spacing, nextafter, ldexp, copysign, signbit


Примеры

>>> import numpy as np
>>> 
>>> np.frexp(12)
(0.75, 4)
>>> 
>>> 0.75*2**4
12.0

Иногда бывают такие случаи, когда обратное возведение двойки в полученную степень выдает ошибку, если значение степени отрицательно:

>>> m, p = np.frexp(1e-77)
>>> m, p
(0.5789604461865809, -255)
>>> 
>>> m*2**p
Traceback (most recent call last):
  File "", line 1, in 
ValueError: Integers to negative integer powers are not allowed.

Все из-за типов данных, которые очень важны для вычислений под капотом NumPy. При возникновении таких ошибок иногда нужно просто, где-нибудь добавить точку:

>>> m*2.**p
1e-77

>>> 
>>> 
>>> x = [0, 1, 2, 3]
>>> np.frexp(x)
(array([0.  , 0.5 , 0.5 , 0.75]), array([0, 1, 2, 2], dtype=int32))
>>> 
>>> x = [0.1, 0.2, 0.3]
>>> np.frexp(x)
(array([0.8, 0.8, 0.6]), array([-3, -2, -1], dtype=int32))
>>> 
>>> 
>>> #  Данная функция неприменима к комплексным числам:
... np.frexp(1 + 1j)
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: ufunc 'frexp' not supported for the input types,
and the inputs could not be safely coerced to any supported
types according to the casting rule ''safe''