永发信息网

C语言求函数定积分

答案:3  悬赏:10  手机版
解决时间 2021-11-10 16:56
C语言求函数定积分
最佳答案
问题就是出在数据类型上的选用上,precision=0.0000001时已经超过了float的数据范围,所以导致数据截断后precision=0.000000,从而程序在计算积分时可能陷入死循环,应该采用double型数据类型。其实不推荐楼主用如此多的define语句,程序的可读性和风格应该重于编程员的劳动度。。。
还有楼主对自然对数e的define也已经超过了计算机的可识别范围。。您那样精确的定义e并不会在结果上获得更加精确地结果,其实反倒会起到相反的作用,要知道与其用一个这样可能导致内存出错以及必定会导致数据截断的变量来实现精度的提高远远不如采用一个更精确的积分算法,而且c语言提供了自然数e为底的指数函数~而且貌似您的积分算法是不准确的,梯形积分的定义并非如此,其再两端的函数值应该只取1/2.希望您多加细心~
如果不介意的话,就是你的precision应该改为step~这样会能更加准备的表达了这个变量的作用,在你的程序中precision变量其实是积分步长~在数值计算方法中积分精度的控制往往不是通过细化步长来表达,而是通过后一个积分值-前一个积分值吧追答嗯,是的,需要include,函数原型为:double exp(double x)
全部回答
pow
原型:extern float pow(float x, float y)
接收的是float的值,你那e……能用float表示么……
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);
}
你复制这些代码,自己试一下
积分我早忘光了,我只检查代码的有效性,希望对你有帮助
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
联想Thinkpad T440p能换显卡吗?如果能换显卡
评审结果为“等待”状态,后续将如何进行申请
怎么要的啊
日本的武士服都包括哪几部分? 打算出一套日
有没有一种软件可以用很多小字组成一个大字,
苦瓜蜂蜜和香蕉合起来吃能减肥吗?几天见效
四万以内能买到新车吗
将《望洞庭》改写成作文怎么写
胶卷一部分曝光是不是一卷都没办法用了
去牟平高速路口怎么走坐几路车到那下车
钻石卫浴是不是品牌
守护丽人的拼音怎么打
弹尽粮绝无退路打一0至9数字
老旗云水温传感器和曲轴传感器线头的区分
199x62十62用简便方法怎么算
推荐资讯
怎样才能快速去除蚊子块啊
PSP《MH2G》战斗猫问题
现在一建和造价哪个好挂靠
柴油机从量油孔冒机油是怎么回事
为什么所有男人都喜欢潮汕姑娘
一部民国的电视剧,关于染坊的,但绝不是大染
石龙火车站有地铁吗
34+6-多少等于10
具象绘画和抽象绘画有什么区别
真正的官方工商银行的网页是什么
cute ftp 8.0功能设置问题
书荒,求推荐小说
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?