请问为什么不能正确输出函数值,总是1.INF00
需要生成100000的时间序列,程序如下:#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
//#define N 100000
void main()
{
FILE *fid;
double lambda=1000.0;
unsigned long int i;
double r;
double *t_arrival,*x,sum;
x=(double*)malloc(100000*sizeof(double));
t_arrival=(double*)malloc(100000*sizeof(double));
for (i=0;i<100000;i++)
*(t_arrival+i)=0;
fid=fopen("result.txt","rw");
srand((unsigned)time(NULL)); // 用当前时间来定种子
fprintf(fid,"time=\n");
for (sum=0,i=0;i<100000;i++)
{
r = ((double)rand()/((double)(RAND_MAX)+(double)(1)));
*(x+i) = (-1.0/lambda)*log(r);
sum+=*(x+i);
}
for(i=0;i<100000;i++)
printf("%10f",*(x+i));
printf("sum=%f",sum);
for (i=1;i<100000;i++)
*(t_arrival+i)=*(t_arrival+i-1)+*(x+i-1);
free(x);
for (i=0;i<100000;i++){
printf("%10f",*(t_arrival+i));
}
for(i=0;i<100000;i++)
{
fprintf(fid,"%f\n",*(t_arrival+i));
}
free(t_arrival);
fclose(fid);
}
*(x+i)显示数据都正常,但当i较小时输出的*(t_arrival+i)正常,i较大时就出现1.INF00(*(t_arrival+i)的最大值没超过double的范围),大家帮忙看看,谢谢了。 问题在于这句话:
r = ((double)rand()/((double)(RAND_MAX)+(double)(1)));
极有可能得到r==0的情况,这样就将使得:
*(x+i) = (-1.0/lambda)*log(r);中的对数操作得到一个无穷大,进而影响后来的叠加操作:
for (i=1;i<100000;i++)
*(t_arrival+i)=*(t_arrival+i-1)+*(x+i-1);
最终使*(t_arrival+i)在某个i之后全部为无穷大。
要想修正此问题,可以在r的得到处加一个修正:
while (r ==0)
{
r = ((double)rand()/((double)(RAND_MAX)+(double)(1)));
}
并在前面的初始化处指定r的初始值:
double r=0;
页:
[1]