【发布时间】:2016-08-23 20:32:29
【问题描述】:
我之前发布过这个,用户告诉我在 codereview 上发布。我做到了,他们关闭了它......所以在这里再一次:(我删除了旧问题)
我有这些公式:
我需要 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;
}
Erlang 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!但它无法处理它。我认为原始数据类型太小而无法正常工作,或者你说什么?
顺便说一句:这是我用于第一个泊松的阶乘函数:
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)
如果我对 getErlangC 的第一个参数 (m) 使用高于 170 的值,例如:
输入:
double l = getErlangC(500, 487, 0.974);
printf("%g", l);
输出:
naN (incorrect)
例外:
0.45269
我的方法如何?有没有更好的方法来计算 Poisson 和 erlangC?
一些信息:Excel 具有 POISSON 函数,并且在 Excel 上它可以完美运行...是否有办法查看 EXCEL 用于 POISSON 的算法(代码)?
【问题讨论】:
-
如果问题已关闭或没有让您满意,请勿转发!
-
你没有理解它..在 Codereview @Olaf 上关闭
-
“我以前发过这个,...” - 不,你先在这里发过,然后是代码审查,现在又来了!
-
你上次没看cmets吗?应该不需要计算那个惊人的阶乘。您的系列的运行项可以乘以
u并除以k,然后添加到系列总和(参考previous question中的第二个公式)。