np.exp (x), когда x мало - PullRequest
       20

np.exp (x), когда x мало

0 голосов
/ 04 июня 2018

Я попробовал следующее:

import  numpy as np

x = -1.20831312e+05
print np.exp(x)     # answer: x = 0.0
print np.expm1(x)   # answer: x = -1.0

По словам Вольфрама, оно должно быть 4.24578... × 10^-52477.Как я могу обойти это?Мне нужно сравнить np.exp(x) для небольшого значения x.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Вам придется работать с логарифмической шкалой.Как подсказывает @norrius, вы могли бы просто поработать с крестиками, но если вы хотите превратить это в научную нотацию, попробуйте следующее:

def exp_to_sci(x):
  coeff, exp = np.modf(x / np.log(10.0))
  return 10**(coeff + 1), exp - 1

Если вы попробуете это на своем примере, вы получите:

>>> exp_to_sci(-1.20831312e+05)
(4.2457778774122303, -52477.0)

- это тот же коэффициент и показатель, что и у Вольфрама.

0 голосов
/ 04 июня 2018

Вы можете использовать sympy или bigfloat:

>>> x = -1.20831312e+05
>>> 
>>> import sympy as sp
>>> sp.exp(x)
4.24577787737720e-52477
>>> 
>>> import bigfloat
>>> bigfloat.exp(x)
BigFloat.exact('4.2457778773771979e-52477', precision=53)
0 голосов
/ 04 июня 2018

Вы сохраняете значение в numpy как 64-битное число с плавающей запятой.Наименьшее ненулевое число, которое вы можете сохранить таким образом: 2^(1-1023) = 2^-1022.

Поскольку ваш номер на порядок меньше, он сохраняется как 0.0.

...