用Maclaurin级数近似计算cos(x)
所以,我试图创建一个程序,通过使用泰勒近似来计算cos(x) 程序非常简单:用户输入一个参数x(x是弧度的角度)和一个浮点ε,这是cos(x)值的精度 基本上,程序必须做的唯一一件事就是计算这个总和: x^0/0!-x^2/2!+x^4/4!-x^6!+x^8/8!-。。。,直到项小于ε,也就是cos(x)的值,它将在我们的精度范围内 下面是代码:用Maclaurin级数近似计算cos(x),c,C,所以,我试图创建一个程序,通过使用泰勒近似来计算cos(x) 程序非常简单:用户输入一个参数x(x是弧度的角度)和一个浮点ε,这是cos(x)值的精度 基本上,程序必须做的唯一一件事就是计算这个总和: x^0/0!-x^2/2!+x^4/4!-x^6!+x^8/8!-。。。,直到项小于ε,也就是cos(x)的值,它将在我们的精度范围内 下面是代码: #include <stdio.h> /* Calculates cos(x) by using a Taylor approxima
#include <stdio.h>
/* Calculates cos(x) by using a Taylor approximation:
cos(x) = x^0/(0!) - x^2/(2!) + x^4/(4!) - x^6/(6!) + x^8/(8!) - ... */
int main(void)
{
int k; // dummy variable k
float x, // parameter of cos(x), in radians
epsilon; // precision of cos(x) (cos = sum ± epsilon)
sum, // sum of the terms of the polynomial series
term; // variable that stores each term of the summation
scanf("%f %f", &x, &epsilon);
sum = term = 1, k = 0;
while (term >= epsilon && -term <= epsilon)
// while abs(term) is smaller than epsilon
{
k += 2;
term *= -(x*x)/(k*(k-1));
sum += term;
}
printf("cos(%f) = %f\n", x, sum);
return 0;
}
#包括
/*使用泰勒近似计算cos(x):
cos(x)=x^0/(0!)-x^2/(2!)+x^4/(4!)-x^6/(6!)+x^8/(8!)-*/
内部主(空)
{
int k;//伪变量k
float x,//cos(x)的参数,以弧度为单位
ε;//cos(x)的精度(cos=总和±ε)
sum,//多项式级数项的和
term;//存储求和的每个项的变量
scanf(“%f%f”、&x、&epsilon);
总和=项=1,k=0;
while(term>=epsilon&&-term错误在于while循环的条件:
while (term >= epsilon && -term <= epsilon)
您应该只使用标准浮点abs函数,fabs
,因为它使代码的功能更加明显:
while (fabs(term) >= epsilon)
应用该更改并编译您的程序后,我使用它来计算cos(3.141593)=-1.000004,这是正确的。只是添加到Charliehorse55的答案中
通常使用简单的三角学进行参数约简
cos(x + y) = cos(x)cos(y) - sin(x)sin(y)
sin(x + y) = cos(x)sin(y) + sin(x)cos(y)
将参数缩减为[0..SmallAngle]范围,然后才计算泰勒展开。并与数学库链接。@ring0-遗憾的是,近似算法有时会给出一些愚蠢的结果。如果超出-1..+1范围的估计值是不可容忍的,您可以随时添加检查以强制执行这些限制。谢谢,这非常有用!=D我使用的部分真是太愚蠢了“&&”而不是“| |”,是的,我本可以使用数学库中的fabs,但我觉得这有点奇怪(我的意思是,cos(x)函数也在数学库中!)。无论如何,再次感谢您的帮助!
cos(x + y) = cos(x)cos(y) - sin(x)sin(y)
sin(x + y) = cos(x)sin(y) + sin(x)cos(y)