2014-11-23 136 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