我正在尝试编写以弧度计算角度tan的函数。我必须使用泰勒系列使用迭代来做到这一点,但仅限于前13位提名者和分母。这是公式:http://upload.wikimedia.org/math/e/b/1/eb1675c46a1350a0983e57abf736b78c.png。在最后一次迭代之后,角度1.024的正确结果应该是大约1.642..etc。我的大概是2.528551e + 000,这是完全错误的。 我真的很感谢所有想法我做错了什么。
这是我的功能:
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;
}
答案 0 :(得分:1)
我已经简化了迭代循环,现在它可以正常工作。我删除了不必要的数组指针,以及重复循环变量测试的两个整数i
和j
。但最重要的是,我将数组总和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