Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的泰勒级数_C_Math_Taylor Series - Fatal编程技术网

C中的泰勒级数

C中的泰勒级数,c,math,taylor-series,C,Math,Taylor Series,我正试图制作一个程序,用泰勒级数计算cos(x)函数,到目前为止,我得到了: int factorial(int a){ if(a < 0) return 0; else if(a==0 || a==1) return 1; else return a*(factorial(a-1)); } double Tserie(float angle, int repetitions){ double series = 0.0; float i; fo

我正试图制作一个程序,用泰勒级数计算cos(x)函数,到目前为止,我得到了:

int factorial(int a){

if(a < 0)
    return 0;
else if(a==0 || a==1)
    return 1;
else
    return a*(factorial(a-1));
}

double Tserie(float angle, int repetitions){
    double series = 0.0;
    float i;

for(i = 0.0; i < repeticiones; i++){
    series += (pow(-1, i) * pow(angle, 2*i))/factorial(2*i);
    printf("%f\n", (pow(-1, i) * pow(angle, 2*i))/factorial(2*i));
}
return series;
int阶乘(inta){
if(a<0)
返回0;
else如果(a==0 | | a==1)
返回1;
其他的
返回a*(阶乘(a-1));
}
双Tserie(浮动角度,整数重复){
双系列=0.0;
浮点数i;
对于(i=0.0;i
}


举个例子,我用角度=90,重复次数=20来计算cos(90),但这是没有用的,我只是不断地得到接近无穷大的值,任何帮助都将不胜感激。

首先,角度是弧度,所以对于90度角,你需要通过
m\u PI/2

此外,对于像阶乘这样微不足道的东西,您应该避免使用递归函数,迭代编写它需要1/4的工作量,而且它的性能会更好。实际上,您甚至不需要它,您可以将阶乘保留在临时变量中,然后在每一步将其乘以
2*i*(2*i-1)
。请记住,在这一步中,您将很快遇到一道代表性/精确性墙

您也不需要实际调用
pow
for-1来调用
i
,一个简单的
i%2?1:-1
就足够了。这样,它的速度更快,并且在增加
i
时不会丢失精度

哦,不要让我浮动,它是一个整数,让它成为一个整数。既然你泄露了很多精度,为什么要让它更糟呢


最重要的是,您将cos近似为0,但将其称为pi/2。这样做会产生很大的误差。

泰勒级数用于数学余弦函数,其参数以弧度为单位。所以90可能并不意味着你认为它在这里意味着什么

此外,参数从0开始的时间越长,序列需要的术语就越多。一般来说,在你开始看到连续的项变得更小,甚至更多,以达到收敛之前,项的数量需要与论点的大小相当。对于x=90来说,20是个少得可怜的术语

另一个问题是将阶乘计算为
int
。阶乘函数增长非常快——已经13年了!普通的C
int
(在32位机器上)将溢出,因此超出第六位的术语无论如何都是完全错误的

事实上,90的阶乘和幂很快变得太大,以至于不能用
double
s来表示。如果希望有机会看到级数收敛,则不能从头开始计算每个项,而应使用以下公式从上一个项中导出它:

nextTerm = - prevTerm * x * x / (2*i-1) / (2*i);

你不是说90度吧?泰勒级数仅在使用弧度时有效。即使这样,它们也只能在离开发点更近一点(在你的情况下,零)的地方工作。。。现在觉得自己很愚蠢。非常感谢您的支持!