Экспонента больших отрицательных чисел

Как вычислить число, такое как np.exp(-28000) на Python? Ответ около 5E-12161. Мне сказали, что из-за формата с плавающей запятой двойной точности я смогу вычислить только число > 1e-2048.


person Daniel George    schedule 29.03.2017    source источник
comment
в чем проблема с np.exp(-28000)?   -  person Eric    schedule 29.03.2017
comment
Я получаю 0,0 для np.exp(-28000)   -  person Daniel George    schedule 29.03.2017
comment
Что ты собираешься делать с этим номером? Можете ли вы организовать свои расчеты так, чтобы вам нужно было работать только с логарифмами чисел? -28000 гораздо проще работать, чем exp(-28000).   -  person Warren Weckesser    schedule 29.03.2017
comment
Я пытаюсь создать затухающую синусоиду с заданным массивом времени до 28000   -  person Daniel George    schedule 29.03.2017
comment
@WarrenWeckesser: см. мой полный вопрос: stackoverflow.com/q/43100725/6943476   -  person Daniel George    schedule 29.03.2017


Ответы (3)


Попробуйте десятичный модуль.

Decimal(math.exp(1))**-28000
person phg1024    schedule 29.03.2017
comment
Благодарю вас! Теперь мне нужно выяснить, как это сделать для массива - person Daniel George; 29.03.2017
comment
@DanielGeorge: я добавил подход, позволяющий работать с массивами. Пожалуйста, посмотрите. - person kmario23; 29.03.2017

Попробуйте mpmath для арифметики с плавающей запятой с произвольной точностью.

Редактировать 1:

>>> import mpmath as mp 
>>> import numpy as np
>>> a = np.matrix((0,0)) 
>>> print(a)
[0.0 0.0]
>>> b = mp.matrix(a.tolist())
>>> c = b.apply(mp.exp)
>>> print(c)
[1.0]
[1.0]   
person arduinolover    schedule 29.03.2017
comment
Я попытался установить этот модуль с помощью pip, но он не появился во время компиляции. Кроме того, я пытаюсь найти экспоненту массива, и я слышал, что mpmath этого не делает. - person Daniel George; 29.03.2017
comment
Для массива mpmath можно выполнять операции над массивом. См. приведенный выше пример. - person arduinolover; 29.03.2017
comment
@arduinolover: это не сработало для массивов numpy, и я не знаю, как преобразовать массивы numpy в формат mp. - person kmario23; 29.03.2017
comment
@arduinolover: есть ли простой способ преобразовать массивы в матрицы? См. мой полный вопрос: stackoverflow.com/q/43100725/6943476 - person Daniel George; 29.03.2017

Вы можете определить функцию для вычисления «большой экспоненты» и применить ее к массиву (вдоль оси). Но обратите внимание, что входной массив должен быть типа int.

# solution courtesy: http://stackoverflow.com/a/43084475/2956066
In [97]: def bigexp(x):
    ...:     return Decimal(math.exp(1))**x


In [98]: np.apply_along_axis(bigexp, 1, arr)    

Эффективность (в порядке убывания)

# twice faster than applying along axis 0
In [115]: %timeit np.apply_along_axis(bigexp, 1, a)
1000 loops, best of 3: 272 µs per loop

In [116]: %timeit np.apply_along_axis(bigexp, 0, a)
1000 loops, best of 3: 465 µs per loop
person kmario23    schedule 29.03.2017
comment
Я пытался использовать ваш метод, но получаю эту ошибку: ValueError: ось должна быть меньше, чем arr.ndim; ось=1, ранг=1. См. полный вопрос, который я разместил: stackoverflow.com/q/43100725/6943476 - person Daniel George; 29.03.2017