import math
a = 100
b = 110
e = 2.71828
x = (e**-a)*(a**b)/math.factorial(b)
print round(x, 5)
当a和b很大时,我收到此消息:
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
OverflowError: long int too large to convert to float
答案 0 :(得分:4)
您似乎正在尝试实施泊松分布。对于其平均值的较大值,它非常接近于高斯分布,您不需要计算因子(这比其他人已经说过的那么大)。
http://en.wikipedia.org/wiki/Poisson_distribution#Related_distributions
编辑:事件数k与均值无关,但通常一个人不希望小L的概率如P(200 | L),或者将其舍入为零。
另请参阅Scipy的实现,它似乎使用对数,另一种方式或避免非常大的数字: https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/_discrete_distns.py
编辑:因为它被请求了,R中有一个演示(因为在我当前的设置中它对我来说更快,但数学是相同的)。我把lambda = mean = sigma ^ 2 = 500(没有n&1000的连续性校正):
pois = rpois(1000, 500)
norm = rnorm(1000, 500, sqrt(500))
plot(density(pois))
lines(density(norm))
答案 1 :(得分:1)
您超过了最大浮动值(1.7976931348623157e+308
)。
使用decimal模块:
import math
from decimal import Decimal
a = 200
b = 198
e = 2.71828
x = Decimal(e**-a)*Decimal(a**b)/math.factorial(Decimal(b))
print round(x, 5)
输出:
0.02806
将其与WloframAlpha计算0.0280567
如果您想查看浮动信息,请参阅this:
>>> import sys
>>> print sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
答案 2 :(得分:1)
只要(a ** b)&gt;&gt; math.factorial(b)你可以做到
(a**b)/math.factorial(b)*(e**-a)
这样,数字在转换为float之前变小了