C 将nan作为累计数
我有一个做积分的代码,在第67行开始的最后一个for循环中,我有一个for循环,它在随机生成的点上累积函数值,得到积分(蒙特卡罗积分)。不幸的是,在循环结束后,我得到NAN作为“monte2”变量的结果。我在for循环中编写了一个printf语句来指出错误,但注意到235.494781之后,总和变成了-nan。这个问题背后的原因可能是什么?我正在运行Ubuntu12.04.3 LTS 32位,并用GCC版本4.6.3编译纯C代码。感谢您的帮助,代码如下: 注:如果这有什么不同的话,我的一个朋友最初是在Windows8 64位上用代码块编写代码的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代码。感谢您的帮助,代码如下: 注:如果这有什么不同的话,我的一个朋友最
#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
productNaN
。我说的是函数调用。顺便说一下,我添加了那一点。谢谢你指出这一点,我应该为自己跳过这一点感到羞愧S@Vesnog;它发生;)日志(0)
应该生成-∞, 不是NaN(根据IEEE 754 9.2.1和数学,而不是C标准)。NaN可能是在∞ 在cos(log(t)*log(t))
@EricPostpischil;是的,你是对的。我从来没有说过log0
productNaN
。我说的是函数调用。顺便说一下,我添加了那一点。谢谢你指出这一点,我应该为自己跳过这一点感到羞愧S@Vesnog;它发生了;)