習題5-7 使用函數求余弦函數的近似值 (15分)


本題要求實現一個函數,用下列公式求cos(x)的近似值,精確到最后一項的絕對值小於e:

cos(x)=x0​​/0!x2​​/2!+x4​​/4!x6​​/6!+

函數接口定義:

double funcos( double e, double x ); 
 

其中用戶傳入的參數為誤差上限e和自變量x;函數funcos應返回用給定公式計算出來、並且滿足誤差要求的cos(x)的近似值。輸入輸出均在雙精度范圍內。

裁判測試程序樣例:

#include <stdio.h> #include <math.h> double funcos( double e, double x ); int main() { double e, x; scanf("%lf %lf", &e, &x); printf("cos(%.2f) = %.6f\n", x, funcos(e, x)); return 0; } /* 你的代碼將被嵌在這里 */ 
 

輸入樣例:

0.01 -3.14
 

輸出樣例:

cos(-3.14) = -0.999899


 1 /*個人感覺這道題可以從三個方面進行考慮,通過對比每一項可以看到,
 2 每一項與上一項的區別在於多了一個x*x,多除了一個m*(m-1),以及變號(即乘上-1)*/
 3 double funcos(double e,double x){
 4     //初始sum值設為1,因為第一項求極限值為1
 5     double sum=1.0;
 6     //第一項為1小於e,計算第二項,冪數為m=2.除數也為2*1=2;
 7     double m=2;
 8     double k=2;
 9     //用temp存儲每一項的絕對值
10     double temp=x*x;
11     sum-=temp/k;
12     //剛開始計算得到的temp是第二項的值,如果第二項的值大於e則執行以下流程
13     for(m=4;fabs(temp/k)>e;m+=2){
14         temp=temp*x*x;
15         k=k*(-1)*m*(m-1);
16         sum-=temp/k;
17     }
18     return sum;
19 }
20 
21 /*
22 double funcos( double e, double x ){
23     double tmp1=1,tmp2=1,tmp3=1,sum=1;
24     int i,k;
25     k=-1; 
26     for(i=2;tmp1>e;i+=2){
27         tmp2 = tmp2*x*x;//分子
28         tmp3 = tmp3*i*(i-1);//分母
29         sum = sum + k*tmp2/tmp3;//轉換各項的符號再相加
30         tmp1=tmp2/tmp3;//每一項的絕對值
31         k=-k;//換號
32     }
33     return sum;
34 }
35 */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM