【发布时间】:2018-06-29 14:56:55
【问题描述】:
我想在 C 中为一个项目实现梯形图。我正在使用书中Numerical Recipes in C 第137 页中的一个示例。我首先只是想复制代码,尝试使用它来实现不同的功能,然后再尝试理解每一行。但是,我的程序没有输出正确的答案:
#include <stdio.h>
#include <math.h>
float h(float x)
{
return sin(x);
}
float trapzd(float (*func)(float), float a, float b, int n)
{ float x, tnm, sum, del;
static float s;
int it, j;
if (n == 1) {
return (s=0.5*(b-a)*(h(a)+h(b)));
}
else
{
for (it=1,j=1;j<n-1;j++) it <<=1;
tnm=it;
del=(b-a)/tnm;
x=a+0.5*del;
for(sum=0.0,j=1; j<=it; j++, x+=del) sum+=h(x);
s=0.5*(s+(b-a)*sum/tnm);
return s;
}
}
int main(void)
{
for (int i = 1; i <= 10; ++i)
{
printf("With n = %d, the approximation is %g.\n", i, trapzd(h,0,1,i));
}
}
所以我想将sin(x) 从0 整合到1,这应该等于0.45,但程序输出0.000002。如果我使用exp(x),则输出是0.50000,而不是大约1.7。为什么这不起作用?
【问题讨论】:
-
是的,我在这里复制并调整了节奏。编辑:我刚刚改变了它,它现在至少输出 0.229,一个更好的价值! Edit2:另外,如果我将步数(变量 n)增加到 100,它会输出 -nan。
-
啊,是的,现在它输出了正确的结果。看来是书上的错误了。不过,如果我将步数增加到 100,我不明白为什么它会输出 -nan