- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
因此,我正在尝试创建一个使用泰勒近似计算 cos(x) 的程序。
程序非常简单:用户输入一个参数 x(x 是以弧度为单位的角度)和一个 float ε,它是 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 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;
}
起初,我试图通过计算单独变量“fact”的阶乘来解决它,尽管这会导致溢出,即使 ε 的值相当大也是如此。
为了解决这个问题,我注意到我可以将前一项乘以 -x²/(k(k - 1)),在每次迭代中将 k 增加 2,以获得下一项。我以为这会解决我的问题,但话又说回来,它不起作用。
程序编译正常,但例如,如果我输入:
3.141593 0.001
输出是:
cos(3.141593) = -3.934803
...这显然是错误的。有人可以帮助我吗?
最佳答案
错误在于你的 while 循环的条件:
while (term >= epsilon && -term <= epsilon)
这不是正确的条件。虽然可以通过修复逻辑来修复它:
while (term >= epsilon || -term >= epsilon)
您应该只使用标准的浮点 abs 函数,fabs
,因为它使您的代码的功能更加明显:
while (fabs(term) >= epsilon)
应用该更改并编译您的程序后,我用它来计算 cos(3.141593) = -1.000004
,这是正确的。
关于使用麦克劳林级数近似计算 cos(x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14996107/
考虑函数 y=1/((1-x^5)(1-x^7)(1-x^11)) WolframAlpha 在几秒钟内计算出 MacLaurin 级数展开的前 1000 个元素: https://www.wolfr
我是一名优秀的程序员,十分优秀!