您无法解决。简单地说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(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
同样,在这里也可以使用numpy。