当前位置: 代码迷 >> C语言 >> [讨论]用函数指针和矩形法求定积分的通用程序,运行出错。敬请各位指点!
  详细解决方案

[讨论]用函数指针和矩形法求定积分的通用程序,运行出错。敬请各位指点!

热度:180   发布时间:2005-10-03 22:12:00.0
[讨论]用函数指针和矩形法求定积分的通用程序,运行出错。敬请各位指点!

一个用矩形法求定积分的通用程序。编译,连接均无问题,但运行结果为:floating point divided by 0.

程序如下: #include<math.h> #define E 1e-8 main() { double integral(float low,float up,double (*fun)()); double i_value; printf("\nThe integral of sin(x) from 0 to 1 is:\n"); i_value=integral(0,1,sin); printf("%.8f\n",i_value); printf("The integral of cos(x) from -1 to 1 is:\n"); i_value=integral(-1,1,cos); printf("%.8f\n",i_value); printf("The integral of exp(x) from 0 to 2 is:\n"); printf("%.8f\n",i_value); }

double integral(float low,float up,double (*fun)()) { double h,sum=0,intg1,intg2=0; int i,n=10; h=(up-low)/n; for(i=0;i<n;i++) sum+=(*fun)(low+i*h); intg1=sum*h; for(;fabs(intg2-intg1)>E;) { n*=2; h=(up-low)/n; for(sum=0,i=0;i<n;i++) sum+=(*fun)(low+i*h); intg2=sum*h; } return intg2; }

搜索更多相关的解决方案: 矩形法  指针  函数  integral  

----------------解决方案--------------------------------------------------------
i_value=integral(0,1,sin);
i_value=integral(-1,1,cos);
----------------解决方案--------------------------------------------------------

不好意思,刚才的程序中有明显的低级错误,如:主函数中漏掉了语句{i_value=integral(0,2,exp);},函数integral的形参表中(*fun)后的括号中漏掉了double x(这是一棵芦苇兄找出的错误)。但做了改正后的程序仍然出现同样的运行结果:

The integral of sin(x) from 0 to 1 is:

Floating point error:Davide by 0

改正后的程序如下:

#include<math.h> #define E 1e-8 main() { double integral(float low,float up,double (*fun)(double x)); double i_value;

printf("\nThe integral of sin(x) from 0 to 1 is:\n"); i_value=integral(0,1,sin); printf("%.8f\n",i_value);

printf("The integral of cos(x) from -1 to 1 is:\n"); i_value=integral(-1,1,cos); printf("%.8f\n",i_value);

printf("The integral of exp(x) from 0 to 2 is:\n"); i_value=integral(0,2,exp); printf("%.8f\n",i_value); }

double integral(float low,float up,double (*fun)(double x)) { double h,sum=0,intg1,intg2=0; int i,n=10; /*先求一个初始值*/

h=(up-low)/n; /*h为步长*/ for(i=0;i<n;i++) sum+=(*fun)(low+i*h); intg1=sum*h; /*若相邻两次的积分值绝对值之差不超过所设精度E,就结束循环*/

for(;fabs(intg2-intg1)>E;) { n*=2; h=(up-low)/n; for(sum=0,i=0;i<n;i++) sum+=(*fun)(low+i*h); intg2=sum*h; } return intg2; }


----------------解决方案--------------------------------------------------------
难道没有人看出来错在哪里吗?
----------------解决方案--------------------------------------------------------
可能在那个函数里数据类型出了问题
----------------解决方案--------------------------------------------------------
已经知道这个程序有两个严重错误,分别由风 影子兄和撒播阳光兄指出。非常感谢他们的指点!想要知道这两个错误或是发现其它错误的哥们,敬请跟帖!
----------------解决方案--------------------------------------------------------
  相关解决方案