我正在尝试编写一个程序来计算泊松分布的概率质量函数,P(x = n)和参数lambda,使用这个公式:((e ^ -lambda)*(lambda ^ n))/ n!
当我使用小lambda和小数字时这种方法很有效,但如果我想用lambda 20计算例如P(x = 30),结果是4.68903e 006,这是错误的.
我认为问题是计算n!.我实现了一个计算阶乘值的函数,并使用无符号长long数据类型作为阶乘计算的结果,但问题是数量为30!等于265,252,859,812,191,058,636,308,480,000,000,无符号多头的最大数量为18,446,744,073,709,551,615,小于30!
我该怎么办才能解决这个问题?在c中有没有其他方法或任何函数来计算这个prabability?
数据类型
解决方法:
处理大n的一种解决方法是计算日志域中的分布:
X = ((e^-lambda)*(lambda^n))/n!
ln X = -lambda + n*ln(lambda) - Sum (ln(n))
return e^X