首页 > 解决方案 > 关于python计算不一致的好奇问题

问题描述

我正在尝试使用 Python 学习泊松分布。我想使用列表理解生成一个概率列表。保证公式不会返回负数。但是,当我在下面的列表理解中使用时,我得到了很多负数。

请您向我解释一下导致问题的原因。有关详细信息,请参阅下面的行。

谢谢你们。

import math
import numpy as np

lam = 15
a = np.arange(30)
b = [np.exp(-lam)*(lam**x)/math.factorial(x) for x in a]

[3.059023205018258e-07,
 4.588534807527386e-06,
 3.44140110564554e-05,
 0.000172070055282277,
 0.0006452627073085387,
 0.0019357881219256162,
 0.0048394703048140406,
 0.010370293510315801,
 -0.013141028594890315,
 -0.0001781617069955619,
 9.481664980368431e-05,
 -2.362463102985818e-06,
 -2.1020607345176417e-07,
 -3.1555253576611854e-08,
 -3.6677408619686507e-09,
 3.5112039118960344e-10,
 1.520183133726461e-11,
 -1.3618446037306896e-12,
 9.639826317732186e-14,
 4.996694908364656e-16,
 -1.6527804252450604e-16,
 1.052286501865168e-17,
 1.6130198477088384e-19,
 3.5537768829770886e-21,
 1.0354451630381044e-22,
 -2.257593163998853e-23,
 6.599657279663544e-27,
 3.666476266479747e-27,
 1.9641837141855786e-27,
 -2.4206987189043917e-29]

标签: pythonlist-comprehension

解决方案


的元素np.arange(30)numpy.int64s,可以溢出负数:

>>> a = np.arange(30)
>>> 15**a[19]
-4608176067875183057

对于列表理解,您根本不需要 NumPy:

lam = 15
a = range(30)
b = [math.exp(-lam)*(lam**x)/math.factorial(x) for x in a]

推荐阅读