我正在尝试使用梯形规则将函数1/((1+x^2)x^0.5)
在0和无穷大之间进行整合。
我需要找到N的值,它在使用double float时可以提供最高精度,我通过运行程序增加N值来完成,直到N的连续值给出的总数之间没有差异但是我陷入了无限循环。
由于
贝丝
#include<stdio.h>
#include<math.h>
#include<float.h>
double inter(double x, double h, double y, double N, double total)
{
h=(y-x)/(N-1);
total= total +0.5*(1/((1+pow(x,2))*sqrt(x)));
x=x+h;
while (x<y)
{
total=total+(1/((1+pow(x,2))*sqrt(x)));
x=x+h;
//printf("t - %lf \n", total);
//printf("x - %lf \n", x);
}
total= total +0.5*(1/((1+pow(x,2))*sqrt(x)));
total=total*h;
return total;
}
main()
{
double x,y,total,h,c,d,f,N, finish;
x=DBL_EPSILON;
y=331;
total=0;
N=0.5;
c=inter(x,h,y,N,total);
d=0;
finish=0;
while(finish==0)
{
d=inter(x,h,y,N,total);
if(d==c)
{
finish=1;
}
else
{
c=d;
d=0;
h++;
printf("%lf/n", h);
}
}
printf("%lf\n", d);
}
答案 0 :(得分:0)
在iter()
函数中,h
为否定,导致x
为负数。负数的sqrt()
会返回NaN
。此外,由于h
为负数,x
继续变小,因此总是小于y
,这是无限循环的原因。< / p>
h
是否定的,因为分母(N-1
)出现在-0.5
(N传入0.5)。
答案 1 :(得分:0)
double h
尚未初始化。您将它作为函数参数传递,然后将其覆盖以用作局部变量。但是,在主循环中,您增加h
(使用++
运算符,这将更好地作为h+=1
),然后再将其传递给函数,但它没有效果,因为{ {1}}仍然在函数中写入。
作为一种技术,您使用h
作为布尔值。它应该是double finish
。