你无法解决它。简单地answer1.sum()==0
,并且不能执行除以零的操作。
发生这种情况是因为answer1
是 2 个非常大的负数的指数,因此结果四舍五入为零。
nan
在这种情况下由于被零除而返回。
现在要解决您的问题,您可以:
- 去一个高精度数学图书馆,比如mpmath https://code.google.com/p/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
and 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 的解有多接近(link http://www.wolframalpha.com/input/?i=Log%5B%28exp%5B-3*1089%5D%2Bexp%5B-3*1093%5D%29%2F%28%5Bexp%5B-3*1000%5D%2Bexp%5B-3*4443%5D%29%5D):
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 http://www.wolframalpha.com/input/?i=%28exp%5B-3*1089%5D%2Bexp%5B-3*1093%5D%29%2F%28%5Bexp%5B-3*1000%5D%2Bexp%5B-3*4443%5D%29)
1.105034914720621496.. × 10^-116 # Wolfram alpha.
再说一次,在这里使用 numpy 也是安全的。