永发信息网

C语言求函数定积分

答案:3  悬赏:10  手机版
解决时间 2021-11-10 16:56
  • 提问者网友:几叶到寒
  • 2021-11-10 09:20
C语言求函数定积分
最佳答案
  • 五星知识达人网友:青尢
  • 2021-11-10 10:41
问题就是出在数据类型上的选用上,precision=0.0000001时已经超过了float的数据范围,所以导致数据截断后precision=0.000000,从而程序在计算积分时可能陷入死循环,应该采用double型数据类型。其实不推荐楼主用如此多的define语句,程序的可读性和风格应该重于编程员的劳动度。。。
还有楼主对自然对数e的define也已经超过了计算机的可识别范围。。您那样精确的定义e并不会在结果上获得更加精确地结果,其实反倒会起到相反的作用,要知道与其用一个这样可能导致内存出错以及必定会导致数据截断的变量来实现精度的提高远远不如采用一个更精确的积分算法,而且c语言提供了自然数e为底的指数函数~而且貌似您的积分算法是不准确的,梯形积分的定义并非如此,其再两端的函数值应该只取1/2.希望您多加细心~
如果不介意的话,就是你的precision应该改为step~这样会能更加准备的表达了这个变量的作用,在你的程序中precision变量其实是积分步长~在数值计算方法中积分精度的控制往往不是通过细化步长来表达,而是通过后一个积分值-前一个积分值吧追答嗯,是的,需要include,函数原型为:double exp(double x)
全部回答
  • 1楼网友:独行浪子会拥风
  • 2021-11-10 11:26
pow
原型:extern float pow(float x, float y)
接收的是float的值,你那e……能用float表示么……
  • 2楼网友:梦中风几里
  • 2021-11-10 10:47
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(11): warning C4305: “初始化”: 从“double”到“float”截断
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(39): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(43): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
1>c:\users\administrator\programs\c\定积分\定积分\定积分.c(47): warning C4244: “return”: 从“double”转换到“float”,可能丢失数据
把所有的float改成double试一下!追问不行啊,就算第一个函数,下限1.0,上限10.0,结果为0.000000追答请输入类型(1~5):
1
输入积分上限:
10
输入积分下限:
1
定积分值为:58.500002
我在Linux上测试的结果
#include
#include
#include

#define g 9.81
#define e 2.71828182845904523536028747135266249775724709369995
#define F double
#define SCS scanf
#define PR printf
#define D "%d\n"
#define PF "%lf\n"
#define D2 D D
void swap( int * , int * );
F f1( F );
F f2( F );
F f3( F );
F f4( F );
F f5( F );
F integral( F , F , F(*pt)( F ) , F );

void swap(int *ph1,int *ph2)
{
int temp;
temp=*ph1;
*ph1=*ph2;
*ph2=temp;
}

void main( void )
{
int type;
F u_limit,l_limit,precision=0.0000001,(*p_pt)(F);
PR("请输入类型(1~5):\n");
SCS("%d",&type);
switch(type)
{
case 1: p_pt=f1;break;
case 2: p_pt=f2;break;
case 3: p_pt=f3;break;
case 4: p_pt=f4;break;
case 5: p_pt=f5;break;
default:PR("ERROR!");
}
PR("输入积分上限:\n");
SCS("%lf",&u_limit);
PR("输入积分下限:\n");
SCS("%lf",&l_limit);
PR("定积分值为:%lf\n",integral(u_limit,l_limit,p_pt,precision));
}
F f1(F x1)
{
return(1+x1);
}
F f2(F x2)
{
return(2*x2+3);
}
F f3(F x3)
{
return(pow(e,x3)+1);
}
F f4(F x4)
{
return(pow((1+x4),2));
}
F f5(F x5)
{
return(pow(x5,3));
}
F integral(F ul,F ll,F (*pt)(F x),F pc)
{
F sum=0;
int counter;
//for(counter=0;counter*pc+ll<=ul;counter++) 符点数不能这样判断!!!!
for(counter=0;(ul-(counter*pc+ll))>-0.0000001;counter++)
{
sum+=pc*(*pt)(ll+counter*pc);
}
return(sum);
}
你复制这些代码,自己试一下
积分我早忘光了,我只检查代码的有效性,希望对你有帮助
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯