本題要求實現一個函數,用下列公式求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 */
