C程序计算高精度的泊松分布

泊松分布 

【问题描述】

泊松分布是一种常用的离散型概率分布,数学期望为m的泊松分布的分布函数定义如下:

P(m, k) = mk * e-m/k!  (k = 0, 1, 2, 3, …)

对于给定的m和k (0<m<2000, 0<= k < 2500),计算其概率,以科学格式输出,保留小数点后6位有效数字。

可以使用数学库函数,误差不超过0.000001。

【输入形式】

输入文件为当前目录下的poisson.in。 文件中包含两个数字,分别为m,k的值。

【输出形式】

输出文件为当前目录下的poisson.out。 文件中输出泊松分布的值,值以科学格式输出,保留小数点后6位有效数字。

【输入样例】

1 0

【输出样例】

3.678794e-01

【时间限制】

1s

【空间限制】

65536KB

【上传文件】

上传c语言源程序,文件名为poisson.c。

 源程序

//by yin
#include "stdlib.h"
#include "stdio.h"
void getValue(double* v1,int* exp1){
double v=*v1;
int exp=0;
double t=v>=1?0.1:10;
int i;
for(i=0;v>=10||v<1;i++){
v*=t;
}
exp=t==10?-i:i;
*v1=v;
*exp1=exp;
}
void merge(double* v,int* exp,double v1,int exp1){
double value=(*v)*v1;
int exp0;
getValue(&value,&exp0);
*exp=*exp+exp1+exp0;
*v=value;
}
void print(double v,int exp,FILE* out){
fprintf(out,"%.6lf",v);
fputc('e',out);
if(abs(exp)==0)
fprintf(out,"0");
else if(abs(exp)<=9){
if(exp<0)fprintf(out,"-0");
else fprintf(out,"0");
}
else if(abs(exp)<=99){
if(exp<0)fprintf(out,"-0");
else fprintf(out,"0");
}
fprintf(out,"%d",abs(exp));
}
int main(){
FILE* input,* output;
input = fopen("poisson.in","r");
output = fopen("poisson.out","w");

int m,k,n,i;
fscanf(input,"%d %d",&m,&k);
double value=0.0;
double v=1.000,v1;
int exp=0,exp1=0;
n=k;
while(n>0){
v1=((double)m)/((double)n);
n--;
// printf("%lf %d--%lf %d\n",v1,n+1,v,exp);
getValue(&v1,&exp1);
//printf("getv\n");
merge(&v,&exp,v1,exp1);
//printf("MERGE\n");
}
v1=3.6787944117;
exp1=-1;
for(i=1;i<=m;i++){
merge(&v,&exp,v1,exp1);
}
print(v,exp,output);
fclose(input);
fclose(output);
}

转载于:https://www.cnblogs.com/yinpc/archive/2012/03/11/2390366.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值