声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3436|回复: 1

[C/C++] 请问为什么不能正确输出函数值,总是1.INF00

[复制链接]
发表于 2010-6-13 16:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
需要生成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的范围),大家帮忙看看,谢谢了。
回复
分享到:

使用道具 举报

发表于 2010-10-1 13:28 | 显示全部楼层
问题在于这句话:

  1. r = ((double)rand()/((double)(RAND_MAX)+(double)(1)));
复制代码

极有可能得到r==0的情况,这样就将使得:
  1. *(x+i) = (-1.0/lambda)*log(r);
复制代码
中的对数操作得到一个无穷大,进而影响后来的叠加操作:
  1. for (i=1;i<100000;i++)
  2.   *(t_arrival+i)=*(t_arrival+i-1)+*(x+i-1);
复制代码

最终使*(t_arrival+i)在某个i之后全部为无穷大。

要想修正此问题,可以在r的得到处加一个修正:

  1.   while (r ==0)
  2.   {
  3.    r = ((double)rand()/((double)(RAND_MAX)+(double)(1)));
  4.   }
复制代码

并在前面的初始化处指定r的初始值:

  1. double r=0;
复制代码


您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 09:10 , Processed in 0.052760 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表