我之前發佈過這個,用戶告訴我要在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 –