我之前发布过这个,用户告诉我要在codereview上发布它。我做到了,他们关闭它...所以这里更多的时间:(我删除了那个老问题)泊松计算(erlang C)
我有这些公式:
,我需要为erlangC泊松公式式:
我试图重建式中C:
double getPoisson(double m, double u, bool cumu)
{
double ret = 0;
if(!cumu)
{
ret = (exp(-u)*pow(u,m))/(factorial(m));
}
else
{
double facto = 1;
double ehu = exp(-u);
for(int i = 0; i < m; i++)
{
ret = ret + (ehu * pow(u,i))/facto;
facto *= (i+1);
}
}
return ret;
}
爱尔朗C配方能:
double getErlangC(double m, double u, double p)
{
double numerator = getPoisson(m, u, false);
double denominator = getPoisson(m, u, false) + (1-p) * getPoisson(m, u, true);
return numerator/denominator;
}
的主要问题是,在getPoisson
的m
参数是一个很大的值(> 170) 所以要计算> 170!但它无法处理它。我认为原始数据类型太小而无法正确工作,或者你说什么?
顺便说一句:这是阶乘函数I用于第一个泊松:
double factorial(double n)
{
if(n >= 1)
return n*factorial(n-1);
else
return 1;
}
一些样品:
输入:
double l = getErlangC(50, 48, 0.96);
printf("%g", l);
输出:
0.694456 (correct)
输入:
double l = getErlangC(100, 96, 0.96);
printf("%g", l);
输出:
0.5872811 (correct)
如果我使用的值高于170,用于getErlangC的像的第一个参数(米):
输入:
double l = getErlangC(500, 487, 0.974);
printf("%g", l);
输出:
naN (incorrect)
的例外:
0.45269
怎么样我的做法?有没有更好的方法来计算泊松和erlangC?
一些信息:Excel具有POISSON函数,并在Excel上它的工作原理...有没有办法看到EXCEL用于POISSON的算法(代码)?
如果问题已经结束或未得到满意答复,请勿重新发布! – Olaf
[“泊松分布的常规定义包含两个可以在计算机上很容易溢出的项:λk和k !.λk到k的部分也可以产生一个与e-λ相比非常大的舍入误差,因此给出一个错误的结果。“](https://en.wikipedia.org/wiki/Poisson_distribution#Definition)我相信你在这上面花了很多时间。 – EOF
你不明白它......关闭Codereview @Olaf –