你無法解決它。只需answer1.sum()==0
,你不能執行零除。
發生這種情況是因爲answer1
是2個非常大的負數的指數,所以結果舍入爲零。
nan
在這種情況下歸因於零除。
我們解決您的問題,您可以:
- 去一個庫進行高精度的數學,喜歡mpmath。但那不太有趣。
- 作爲一個更大的武器的替代品,做一些數學操作,如下所述。
- 去找一個量身定做的
scipy/numpy
功能,它完全符合你的要求!查看@Warren Weckesser的答案。
在這裏我解釋瞭如何做一些數學操作,幫助解決這個問題。我們有對分子:
以上
x=3* 1089
和
y=3* 1093
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 + 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的溶液(link):
Log[(exp[-3*1089]+exp[-3*1093])/([exp[-3*1000]+exp[-3*4443])] -> -266.999993855806522267194565420933791813296828742310997510523
這個數字和上面指數的區別是+1.7053025658242404e-13
,所以我們在分母上做的近似值很好。
最終的結果是
'exp(-266.99999385580668) = 1.1050349147204485e-116
從Wolfram Alpha的是(link)
1.105034914720621496.. × 10^-116 # Wolfram alpha.
,並再次,它是安全的太在這裏使用numpy的。
但在這種情況下,我需要得到的劃分值由2個非常小的值。 – Heinz
你是什麼意思? – gg349
@海因茨我認爲你的意思是少數人被少數人劃分的情況。在這種情況下,改變你的算法來縮放這兩個數字比找到機械扭曲要好得多。例如,取對數的代碼試圖模擬的分析方程。 當涉及小數目時,計算的穩定性有許多問題。如果可能的話,避免使用其中的任何一個更好。 – Mai