Ви не можете це вирішити. Просто answer1.sum()==0
, і ви не можете виконати ділення на нуль.
Це відбувається тому, що answer1
є експоненцією 2 дуже великих, від’ємних чисел, так що результат округлюється до нуля.
nan
повертається в цьому випадку через ділення на нуль.
Тепер, щоб вирішити вашу проблему, ви могли б:
- зверніться до бібліотеки для високоточної математики, наприклад mpmath . Але це менше задоволення.
- як альтернативу більшій зброї, виконайте деякі математичні маніпуляції, як описано нижче.
- вибирайте спеціальну
scipy/numpy
функцію, яка робить саме те, що ви хочете! Перевірте відповідь @Warren Weckesser.
Тут я поясню, як зробити деякі математичні маніпуляції, які допомагають вирішити цю проблему. Ми маємо це для чисельника:
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)))
де вище x=3* 1089
і y=3* 1093
. Тепер аргумент цієї експоненції є
-x + log(1+exp(-y+x)) = -x + 6.1441934777474324e-06
Що стосується знаменника, ви можете поступити аналогічним чином, але отримати те, що log(1+exp(-z+k))
вже округлено до 0
, так що аргумент експоненціальної функції у знаменнику просто округлений до -z=-3000
. Тоді ви маєте, що ваш результат є
exp(-x + log(1+exp(-y+x)))/exp(-z) = exp(-x+z+log(1+exp(-y+x))
= exp(-266.99999385580668)
що вже надзвичайно близьке до результату, який ви отримали б, якщо б зберегли лише 2 провідних доданки (тобто перше число 1089
в чисельнику та перше число 1000
у знаменнику):
exp(3*(1089-1000))=exp(-267)
Для цього давайте подивимось, наскільки ми близькі від рішення Wolfram alpha ( посилання ):
Log[(exp[-3*1089]+exp[-3*1093])/([exp[-3*1000]+exp[-3*4443])] -> -266.999993855806522267194565420933791813296828742310997510523
Різниця між цим числом та показником, наведеним вище, полягає в +1.7053025658242404e-13
тому, тому наближення, яке ми зробили за знаменником, було чудовим.
Кінцевий результат є
'exp(-266.99999385580668) = 1.1050349147204485e-116
З вольфрама альфа є ( посилання )
1.105034914720621496.. × 10^-116
і знову ж, тут також можна використовувати numpy.