luollx 发表于 2010-6-13 16:14

请问为什么不能正确输出函数值,总是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的范围),大家帮忙看看,谢谢了。

Rainyboy 发表于 2010-10-1 13:28

问题在于这句话:

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]
查看完整版本: 请问为什么不能正确输出函数值,总是1.INF00