2017-04-14 187 views
0

需要我的作業中的任務幫助。 他們給了我們一個計算餘弦的系列,它是: Σ(-1)^ ix^2i /(2i)! 而且任務是在C程序中通過編寫一個取角度爲x的函數並計算它的餘弦值來實現它。系列應該繼續加總,直到系列中的下一個加數小於1.0e-6(0.000001)。我這樣做,它只適用於小數字,如果我把大數字作爲角度,程序就會卡住。用加數求和來計算餘弦

#include <stdio.h> 
#include <math.h> 
#define PI 3.141592 

double my_cos(double angle); 

int main() { 
    double angle, radian, my_res, their_res; 

    printf("Please type a number... \n"); 
    scanf("%lf", &angle); 

    radian = angle * (PI/180); 


    my_res = my_cos(radian); /* result from my custom cosine function */ 
    their_res = cos(radian); /* result from the cos function located in the library math.h */ 

    printf("My result is: %f \nMath.h library result is: %f \n", my_res, their_res); 

    return 0; 
} 

#include <math.h> 
#define ACCURACY 1.0e-6 

long factorial(int x); 


double my_cos(double angle){ 
    int i = 0; 
    double sum = 0, next_addend; 

    do { 
     next_addend = pow(-1, (i+1)) * pow(angle, 2*(i+1))/factorial(2*(i+1)); 
     sum += pow(-1, i) * pow(angle, 2*i)/factorial(2*i); 

     i++; 
    } while (ACCURACY < fabs(next_addend)); 

    return sum; 
} 

/* return the factorial of a given value */ 
long factorial(int x){ 
    if (x == 0) { 
     return 1; 
    } 

    return(x * factorial(x - 1)); 
} 

如果我運行該程序,並插入45: enter image description here

但如果我插入300,這個計劃只是「等待」: enter image description here

我想這與莫名其妙的階乘功能? 我真的很感激你的幫助..

+0

呃,果然,'x'越大,迭代的次數就越多。 – ForceBru

+1

你是否在調試器上運行它以查看永恆循環的位置,爲什麼? –

+2

正如你所說,這很可能是階乘函數的一個問題,但要確定*你應該使用調試器來遍歷代碼並找出結果。即使需要很長時間,也很乏味和乏味,使用調試器對任何程序員來說都是至關重要的技能,即使在愛好層面上也是如此。 –

回答

4

根據sizeof(long)是4或8在你的系統上,你只能計算12!或20!裏面有一個long。另外,在每次迭代中計算多個pow效率非常低。

如果您知道前一個加數(提示:在一張紙上計算它們的比例),請嘗試找出如何計算next_addend的更好解決方案。

+0

所以,即使OP可以計算20 !,他們也可以代表'x'的值,這樣'fabs(x)<4.1620398187437662'只能作爲fabs(x) ForceBru

+0

@ForceBru肯定,但你永遠不應該明確地計算任何因子。關於您對利用週期性的評論:對於實際的實現,一定應該這樣做,但也應該使用最小最大值逼近而不是泰勒多項式。 – chtz