这就是我的任务:
编写一个C函数来计算级数// cos(x)= x-(x2 /2!)+(x4 /4!)-(x6 /6!)+...等等变量realNuber使用弧度而不是度
我失去了精确度,但我不明白在哪里。realNumber = 60的答案一定是0.500,但我有0.501。请帮助。
#include "stdio.h"
#include "inttypes.h"
double power(float N, uint32_t P){
double buffer = 1;
for (int i = 0; i < P; ++i) {
buffer *= N;
}
return buffer;
}
float factorial(float number){
float result = number;
if (number == 0) {
return 0;
}
for (int i = 0; i < number - 1; ++i) {
result *= i + 1;
}
return result;
}
float cos(float x){
float result = x * (3.14159265359 / 180.);
float polar = -1;
for (int i = 2; i < 10; i += 2) {
result += power(result, i) / factorial(i) * polar;
polar *= -1;
}
return result;
}
int main(void){
float realNumber = 0;
float result = 0;
scanf("%f", &realNumber);
result = cos(realNumber);
printf("%.13f", result);
}
我试着在函数cos()中进行修改;也许问题出在别的地方
4条答案
按热度按时间dzhpxtsq1#
您最初写道:
编写一个C函数来计算以下级数的值:// cos(x)= x-(x2 /2!)+(x4 /4!)-(x6 /6!)
但这不是cos的泰勒级数。
正确的公式是:
1
不是x
)*Source
对泰勒级数进行修正,再做一些修正,我得到:
输出
我的代码:
当我重写cos函数以消除使用幂和阶乘函数时,我得到了以下结果:
nuypyhwy2#
你的
cos
函数是完全错误的。解释在注解中。余弦的公式为
1-(x^2/2!) + (x^4/4!) + ...
您尝试使用错误的
x-(x^2/2!) + (x^4/4!) + ...
。一些一般性意见:
虽然修正后的
cos
函数是正确的,但它的效率不是很高。x^n = x * x^(n-1)
.double
而不是float
。noj0wjuj3#
cos函数中的小错误。请尝试此操作。
dfuffjeb4#
下面是我在Java中实现它的方法。代码应该足够类似于C,以便您轻松翻译。不需要幂或阶乘调用。我希望您会同意它要简单得多。
下面是一个Junit测试,显示它工作正常:
使用20个术语精确到9位有效数字。