Как я могу избежать получения результата 0 от exp () для очень маленьких чисел с плавающей точкой? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь получить точное значение из экспоненты, которая получает в качестве входных данных очень маленькую плавающую точку и дает мне результат 0.

Вы можете воспроизвести проблему с помощью следующего кода:

import numpy as np
from math import sqrt, log, exp, pi

k = np.array([[-746.9292399]])
z = exp(k)
print(z)

Результат этого будет 0, для моего p c результат чего-либо меньше, чем -743.0 будет 0

Я попытался использовать mpmath, чтобы решить это следующим образом:

import numpy as np
from math import sqrt, log, exp, pi
import mpmath as mp

k = np.array([[-746.9292399]])
z = mp.exp(float(k))
print(z)

det = np.linalg.det([[z,2,3],[2,2,z],[3,6,2]])
print(det)

Что дает хороший ответ для exp (), однако мне также понадобится поместить этот результат в массив numpy и извлечь из него определитель, который выдает ошибку в коде i. присоединен, потому что numpy не любит числа mpf в своих массивах.

Кто-нибудь знает, как я могу получить результат из exp () таким образом, чтобы я мог использовать его с numpy и его функциями?

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Это обычная проблема с функциями exp и log, так как выход имеет тенденцию довольно быстро исчезать до нуля. Хорошим наблюдением является то, что вы обычно хотите expr(x) - 1 в большинстве научных c вычислений, и большинство реализаций предоставляют для этого пользовательские функции, чтобы избежать проблем числовой стабильности. Так что, если это соответствует вашему варианту использования, вам обязательно следует рассмотреть expm1. Аналогичные соображения применимы и к log, и, следовательно, у нас есть log1p, expm1, log1pexp, log1mexp et c. Подробности здесь: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.expm1.html

0 голосов
/ 26 марта 2020

Хорошо, я работаю над этим уже около 30 минут, и я получил это

import decimal
pow(decimal.Decimal(math.exp(1)),decimal.Decimal(-748.9292399))

Кроме того, отметьте это Экспонента больших отрицательных чисел

есть одна маленькая проблема. Я вычислил вашу проблему с калькулятором windows, и он дал мне 3.819636355e-325

0 голосов
/ 26 марта 2020

мне кажется, что около exp(-745) значение является наименьшим, которое может удерживать число с плавающей точкой.

обратите внимание, что

>>> exp(-744)
1e-323

С плавающей точкой почти полностью сместился вправо , Я считаю, что это предел поплавка python.

...