C 将nan作为累计数

C 将nan作为累计数,c,ubuntu,nan,C,Ubuntu,Nan,我有一个做积分的代码,在第67行开始的最后一个for循环中,我有一个for循环,它在随机生成的点上累积函数值,得到积分(蒙特卡罗积分)。不幸的是,在循环结束后,我得到NAN作为“monte2”变量的结果。我在for循环中编写了一个printf语句来指出错误,但注意到235.494781之后,总和变成了-nan。这个问题背后的原因可能是什么?我正在运行Ubuntu12.04.3 LTS 32位,并用GCC版本4.6.3编译纯C代码。感谢您的帮助,代码如下: 注:如果这有什么不同的话,我的一个朋友最

我有一个做积分的代码,在第67行开始的最后一个for循环中,我有一个for循环,它在随机生成的点上累积函数值,得到积分(蒙特卡罗积分)。不幸的是,在循环结束后,我得到NAN作为“monte2”变量的结果。我在for循环中编写了一个printf语句来指出错误,但注意到235.494781之后,总和变成了-nan。这个问题背后的原因可能是什么?我正在运行Ubuntu12.04.3 LTS 32位,并用GCC版本4.6.3编译纯C代码。感谢您的帮助,代码如下:

注:如果这有什么不同的话,我的一个朋友最初是在Windows8 64位上用代码块编写代码的

#include<stdio.h>
#include<math.h>

float I1(float x)
{
  return exp(-x)*cos(x*x)*cos(x*x);
}

float I2(float t)
{
  return cos(log(t)*log(t))*cos(log(t)*log(t));
}
float random()
{
  float a;
  a=rand()%1000;
  a=a/1000*20;
  //  printf("%.15f\t%f\n",I1(a),a);
  return a;
}
float random2()
{
  float a;
  a=rand()%1000;
  a/=1000;
  //  printf("%.15f\t%f\n",I2(a),a);
  return a;
}

int main()
{
  FILE *data=fopen("data.txt","w");
  FILE *data2=fopen("data2.txt","w");

  float trap=0,monte=0,sum=0, monte2=0;
  float a[1000],b[1000],dt=0.005;
  int i;

  /* Part 1 */

  for(i=0;i<1000;i++)
    a[i]=I1(i*dt);
  for(i=0;i<1000;i++)
    fprintf(data,"%f\t%f\n",i*dt,a[i]);

  for(i=1;i<1000;i++)
    trap+=(a[i]+a[i-1])/2*dt;
  printf("The integral value of I1 is = %f with trapezoid rule\n",trap);


  for(i=0;i<500;i++)
    monte+=I1(random());
  printf("The Monte Carlo Technique value for I1 is %f with 500 samples\n",monte/500*20);

  /* Part 2 */
  dt=0.001;
   printf(" \n");
  for(i=1;i<=1000;i++)
    b[i]=I2(i*dt);
  for(i=1;i<=1000;i++)
    fprintf(data2,"%f\t%f\n",i*dt,b[i]);

  for(i=2;i<=1000;i++)
    trap+=(b[i]+b[i-1])/2*dt;
  printf("The integral value of I2 is = %f with trapezoid rule\n",trap/2);

  for(i=0;i<500;i++)
  {
    monte2+=I2(random2());
    printf("%f \n", monte2);
  }
  printf("The Monte Carlo Technique value of I2 is %f with 500 samples\n",monte2/500);
  printf("\n");
  printf("Comment 1: Two values obtained with trapezoid rule is close to each other;however,they are not exactly same.\n");
  printf("\n");
  printf("Comment 2: The integral value and monte carlo value of I1 is closer than the integral value and monte carlo value of I2.This means that we have better expectation value of I1 with monte carlo technique with 500 samples.\n");
  fclose(data2);
  fclose(data);
  return 0;
}
#包括
#包括
浮点数I1(浮点数x)
{
返回exp(-x)*cos(x*x)*cos(x*x);
}
浮子I2(浮子t)
{
返回cos(log(t)*log(t))*cos(log(t)*log(t));
}
浮点随机数()
{
浮动a;
a=rand()%1000;
a=a/1000*20;
//printf(“%.15f\t%f\n”,I1(a),a);
返回a;
}
浮点随机数2()
{
浮动a;
a=rand()%1000;
a/=1000;
//printf(“%.15f\t%f\n”,I2(a),a);
返回a;
}
int main()
{
FILE*data=fopen(“data.txt”,“w”);
文件*data2=fopen(“data2.txt”,“w”);
浮点数=0,monte=0,sum=0,monte2=0;
浮点数a[1000],b[1000],dt=0.005;
int i;
/*第一部分*/
对于(i=0;i您的函数调用

monte2+=I2(random2());  
可能产生
NaN
。这是因为
random2
可能返回
0
log 0
为无穷大。这将导致
cos(log(t)*log(t))*cos(log(t)*log(t))
产生
NaN

有关
日志
功能,请参见图表:

请注意,图形任意靠近y轴,但不与it1相交


1.源

您的函数调用

monte2+=I2(random2());  
可能产生
NaN
。这是因为
random2
可能返回
0
log 0
为无穷大。这将导致
cos(log(t)*log(t))*cos(log(t)*log(t))
产生
NaN

有关
日志
功能,请参见图表:

请注意,图形任意靠近y轴,但不与it1相交



1.来源

日志(0)
应生成-∞, 不是NaN(根据IEEE 754 9.2.1和数学,而不是C标准)。NaN可能是在∞ 在
cos(log(t)*log(t))
@EricPostpischil;是的,你是对的。我从来没有说过
log0
product
NaN
。我说的是函数调用。顺便说一下,我添加了那一点。谢谢你指出这一点,我应该为自己跳过这一点感到羞愧S@Vesnog;它发生;)
日志(0)
应该生成-∞, 不是NaN(根据IEEE 754 9.2.1和数学,而不是C标准)。NaN可能是在∞ 在
cos(log(t)*log(t))
@EricPostpischil;是的,你是对的。我从来没有说过
log0
product
NaN
。我说的是函数调用。顺便说一下,我添加了那一点。谢谢你指出这一点,我应该为自己跳过这一点感到羞愧S@Vesnog;它发生了;)