2014-11-23 107 views
-3

我正在嘗試編寫計算角度以弧度爲單位的tan的函數。我必須使用taylor系列使用迭代來實現,但只能用於前13個分子&分母。這是公式:http://upload.wikimedia.org/math/e/b/1/eb1675c46a1350a0983e57abf736b78c.png。在最後一次迭代之後,角度1.024的正確結果應該是大約1.642 ..等等。礦大約2.528551e + 000,這是完全錯誤的。 我會非常感謝所有的想法,我做錯了什麼。泰勒級數tan的計算

Here's我的功能:

double ttan(double x) 
{ 
double nominator[13] = {1,1,2,17,62,1382,21844,929569,6404582,443861162,18888466084,113927491862,58870668456604};//first 13 nominators 
double *n = nominator; 
double denominator[13] = {1,3,15,315,2835,155925,6081075,638512875,10854718875,1856156927625,194896477400625,49308808782358125,3698160658676859375};//first 13 denominators 
double *d = denominator; 

int i=0; 
int j=0; 
double t; 
double s; 
double xx=x*x; 
s=t=x; 


for(int test=0;test<13;test++) 
{ 
t=t* xx* *(n+i)/ *(d+j); 
s+=t; 
printf("%e\n",s); 
i++; 
j++; 
} 


int main(int argc, char **argv) 
{ 
if (argc<2) 
return 1; 
char *endptr; 
double p = strtod(argv[1], &endptr); 
ttan(p); 
return 0; 
} 
+1

你迄今所做什麼樣的調試? – 2014-11-23 13:15:20

+2

您最大的分母不在「雙」尾數的意義範圍之內 - 編譯器會警告這一點。 – 2014-11-23 13:27:08

+0

@WV:我試圖用雙格式printf我的第13分母,它工作正常。 – deezy 2014-11-23 13:30:00

回答

1

我已經簡化了您的迭代和現在工作正常。我刪除了不必要的數組指針,以及重複循環變量測試的兩個整數ij。但最重要的是,我將數組總和s初始化爲0而不是x,因爲在第一次迭代中考慮了第一項值(即x),因爲兩個數組的值均爲1作爲其第一個元素。

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

double ttan(double x) 
{ 
    double nominator[13] = {1,1,2,17,62,1382,21844,929569, 
      6404582,443861162,18888466084, 
      113927491862,58870668456604};//first 13 nominators 
    double denominator[13] = {1,3,15,315,2835,155925,6081075, 
      638512875,10854718875,1856156927625,194896477400625, 
      49308808782358125,3698160658676859375};//first 13 denominators 
    int test; 
    double s = 0, xx=x*x; 

    for(test=0;test<13;test++) 
    { 
     s += x * nominator[test]/denominator[test]; 
     printf("%e\n",s); 
     x *= xx; 
    } 
    return s; 
} 

int main(int argc, char **argv) 
{ 
    char *endptr; 
    double p; 
    if (argc<2) 
     return 1; 
    p = strtod(argv[1], &endptr); 
    ttan(p); 
    printf("\nMath library: tan(%f) = %f\n", p, tan(p)); 
    return 0; 

}

我的程序輸出中的1.024

1.024000e+000 
1.381914e+000 
1.532034e+000 
1.595748e+000 
1.622822e+000 
1.634327e+000 
1.639216e+000 
1.641294e+000 
1.642177e+000 
1.642552e+000 
1.642712e+000 
1.642716e+000 
1.642744e+000 

Math library: tan(1.024000) = 1.642829 
+0

我改變了所有雙打做了兩倍,輸出到%lf,但結果是一樣的,所以我認爲問題不在這裏。 – deezy 2014-11-23 13:46:34

+0

@deezy我改變了我的答案。 – 2014-11-23 14:19:02

+0

非常感謝您的建議和時間。 – deezy 2014-11-23 14:34:34