問題就是出在數(shù)據(jù)類型上的選用上,precision=0.0000001時已經(jīng)超過了float的數(shù)據(jù)范圍,所以導(dǎo)致數(shù)據(jù)截斷后precision=0.000000,從而程序在計算積分時可能陷入死循環(huán),應(yīng)該采用double型數(shù)據(jù)類型。其實不推薦樓主用如此多的define語句,程序的可讀性和風(fēng)格應(yīng)該重于編程員的勞動度。。。
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、龍泉網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為龍泉等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
還有樓主對自然對數(shù)e的define也已經(jīng)超過了計算機(jī)的可識別范圍。。您那樣精確的定義e并不會在結(jié)果上獲得更加精確地結(jié)果,其實反倒會起到相反的作用,要知道與其用一個這樣可能導(dǎo)致內(nèi)存出錯以及必定會導(dǎo)致數(shù)據(jù)截斷的變量來實現(xiàn)精度的提高遠(yuǎn)遠(yuǎn)不如采用一個更精確的積分算法,而且c語言提供了自然數(shù)e為底的指數(shù)函數(shù)~而且貌似您的積分算法是不準(zhǔn)確的,梯形積分的定義并非如此,其再兩端的函數(shù)值應(yīng)該只取1/2.希望您多加細(xì)心~
如果不介意的話,就是你的precision應(yīng)該改為step~這樣會能更加準(zhǔn)備的表達(dá)了這個變量的作用,在你的程序中precision變量其實是積分步長~在數(shù)值計算方法中積分精度的控制往往不是通過細(xì)化步長來表達(dá),而是通過后一個積分值-前一個積分值precision 這樣來實現(xiàn)精度控制~呵呵
積分分為兩種,數(shù)值積分,公式積分。
公式積分:部分函數(shù)可以直接用公式求得其不定積分函數(shù)。C語言中可以直接用積分公式寫出其積分函數(shù)。
數(shù)值積分:按照積分的定義,設(shè)置積分范圍的步長,用梯形面積累加求得其積分。
以【f(x)=x*sin(x) 從1到2的積分】為例:
#include?math.h
#include?stdio.h
double?integral(double(*fun)(double?x),double?a,double?b,int,n){
double?s,h,y;
int?i;
s=(fun(a)+fun(b))/2;
h=(b-a)/n;?/*積分步長*/
for(i=1;in;i++)
s=s+fun(a+i*h);
y=s*h;
return?y;/*返回積分值*/
}
double?f(double?x){
return(x*sinx)??/*修改此處可以改變被積函數(shù)*/
}
int?main(){
double?y;
y=integral(f,1.0,2.0,150);/*修改此處可以改變積分上下限和步數(shù),步長=(上限-下限)/步數(shù)*/
printf("y=%f\n",y);
return?0;
}
下面的代碼就是使用矩形法求定積分的。
分別求了sin(x) cos(x) e^x 的定積分
#include iostream
#include cmath
using namespace std;
float integral (float (*p) (float), float a, float b, int n);
float fsin (float); // 對fsin函數(shù)作聲明
float fcos (float); // 對fcos函數(shù)作聲明
float fexp (float); // 對fexp函數(shù)作聲明
int main()
{
float a1, b1, a2, b2, a3, b3, c, (*p) (float);
int n = 40; // 劃分40個小矩形
cout "input a1,b1(sin(x) 定積分的下限和上限):"; //輸入求sin(x) 定積分的下限和上限
cin a1 b1;
cout "input a2,b2:(cos(x) 定積分的下限和上限 )"; // 輸入求cos(x) 定積分的下限和上限
cin a2 b2;
cout "input a3,b3:(e^x定積分的下限和上限)";
cin a3 b3;
p = fsin;
c = integral(p, a1, b1, n); // 求出sin(x)的定積分
cout "The integral of sin(x) is :" c endl;
p = fcos;
c = integral(p, a2, b2, n); // 求出cos(x)的 定積分
cout "The integral of cos(x) is :" c endl;;
p = fexp;
c = integral(p, a3, b3, n); // 求出 的定積分
cout "The integral of exp(x) is :" c endl;
return 0;
}
float integral(float (*p) (float), float a, float b, int n)
//用矩形法求定積分的通用函數(shù)
{
int i;
float x, h, s;
h = (b - a) / n;
x = a;
s = 0;
for (i = 1; i = n; i++)
{
x = x + h;
s = s + (*p) (x) * h;
}
return(s);
}
float fsin(float x) // 計算sin(x) 的函數(shù)
{
return sin(x);
}
float fcos(float x) // 計算cos(x) 的函數(shù)
{
return cos(x);
}
float fexp(float x) // 計算exp(x)的函數(shù)
{
return exp(x);
}
源代碼如下:
#include#includefloat f1(float x)
{
return(1.0+x);
}
float f2(float x)
{
return(2.0*x+3.0);
}
float f3(float x)
{
return(exp(x)+1);
}
float f4(float x)
{
return(pow(1+x,2));
}
float f5(float x)
{
return(pow(x,3));
}
float fsimp(float a,float b,float (*p)(float))
{
float c,s;
c=(a+b)/2;
s=(b-a)/6*(p(a)+4*p(c)+p(b));
return s;
}
int main()
{
float a,b;
printf("請輸入積分下限a的值:");
scanf("%f",a);
printf("請輸入積分上限b的值:");
scanf("%f",b);
printf("%f\n",fsimp(a,b,f1));
}
擴(kuò)展資料
1、對應(yīng)于一個積分式要有一段程序,可以改變程序的一小部分來改變所要求的積分式。
2、除數(shù)不能位0。
3、兩個整數(shù)相除,結(jié)果仍是整數(shù)。
4、若被除數(shù)其中有一個為浮點(diǎn)數(shù)或者兩個都為浮點(diǎn)數(shù),則結(jié)果為浮點(diǎn)類型。操作數(shù)必須為整數(shù),不能是浮點(diǎn)數(shù)。