Nie możesz go rozwiązać. Po prostu answer1.sum()==0
, a nie można wykonać podziału przez zero.
Dzieje się tak, ponieważ answer1
jest wykładniczą z 2 bardzo dużych liczb ujemnych, tak że wynik jest zaokrąglany do zera.
nan
jest zwracana w tym przypadku z powodu podziału przez zero.
teraz, aby rozwiązać swój problem możesz:
- iść do biblioteki dla precyzyjnych matematycznych, jak mpmath. Ale to mniej zabawne.
- jako alternatywa dla większej broni, wykonaj kilka czynności matematycznych, jak opisano poniżej.
- przejdź do dostosowanej funkcji
scipy/numpy
, która robi dokładnie to, co chcesz! Sprawdź odpowiedź @Warren Weckesser.
Tutaj wyjaśniam, jak wykonać kilka operacji matematycznych, które pomagają w tym problemie. Mamy to na liczniku:
exp(-x)+exp(-y) = exp(log(exp(-x)+exp(-y)))
= exp(log(exp(-x)*[1+exp(-y+x)]))
= exp(log(exp(-x) + log(1+exp(-y+x)))
= exp(-x + log(1+exp(-y+x)))
gdzie powyżej x=3* 1089
i y=3* 1093
. Teraz, argument ten wykładniczej
-x + log(1+exp(-y+x)) = -x + 6.1441934777474324e-06
Dla mianownika można postępować podobnie, ale uzyskanie że log(1+exp(-z+k))
już jest zaokrąglana do 0
, tak że argument funkcji wykładniczej w mianowniku jest po prostu zaokrągleniu do -z=-3000
. Trzeba wówczas, że wynik jest
exp(-x + log(1+exp(-y+x)))/exp(-z) = exp(-x+z+log(1+exp(-y+x))
= exp(-266.99999385580668)
który jest już bardzo blisko do wyniku, który chcesz uzyskać, jeśli były, aby zachować tylko 2 wiodące warunki (czyli pierwszego numeru 1089
w liczniku oraz pierwszy numer 1000
w mianowniku):
exp(3*(1089-1000))=exp(-267)
w trosce o to, zobaczmy, jak blisko jesteśmy z roztworu Wolfram alpha (link):
Log[(exp[-3*1089]+exp[-3*1093])/([exp[-3*1000]+exp[-3*4443])] -> -266.999993855806522267194565420933791813296828742310997510523
Różnica między tą liczbą a wykładnikiem powyżej to +1.7053025658242404e-13
, więc przybliżenie, którego dokonaliśmy przy mianowniku, było w porządku.
Wynik końcowy jest
'exp(-266.99999385580668) = 1.1050349147204485e-116
Od Wolfram Alpha jest (link)
1.105034914720621496.. × 10^-116 # Wolfram alpha.
i znowu, że jest bezpieczny w użyciu numpy tu.
Ale w tym przypadku trzeba uzyskać wartości z podziałem o 2 bardzo małe wartości. – Heinz
Co masz na myśli? – gg349
@Heinz Myślę, że chodziło o przypadek, w którym mała liczba jest podzielona przez małą liczbę. W takim przypadku zmień swój algorytm, aby skalować obie liczby w górę, jest o wiele lepszy niż znalezienie mechanicznych zwrotów akcji. Weźmy na przykład logarytm równań analitycznych, które twój kod próbuje symulować. Istnieje wiele problemów ze stabilnością obliczeń przy małych liczbach. Miło jest unikać posiadania któregokolwiek z nich, jeśli to możliwe. – Mai