gpt4 book ai didi

c - 获取 nan 作为累加和

转载 作者:太空宇宙 更新时间:2023-11-04 05:59:42 25 4
gpt4 key购买 nike

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

P.S:代码最初是由我的一个 friend 在 Windows 8 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;
}

最佳答案

你的函数调用

monte2+=I2(random2());  

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

查看log 函数的图表:

enter image description here

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


<子>1。来源Wikipedia

关于c - 获取 nan 作为累加和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21124262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com