任务:根据 sin(x) 的泰勒级数计算,使用名为 mysin 的双函数将其传递给双变量。取用户的 x 值并使用 mysin 函数计算 sin(x)。
问题是程序给了我错误的 sin(x) 值。我一直试图解决这个问题大约 4 个小时,但找不到它。是因为 sin(x) 函数还是我在代码中遗漏了什么?
我的代码:
#include <stdio.h>
double mysin(double x)
{
double value = x;
double sum = x;
int neg_pos = 1;
int fac = 1;
int counter = 0;
while(1)
{
neg_pos *= -1;
fac += 2;
value = value/(fac*(fac-1));
value = value*x*x*neg_pos;
sum += value;
//printf("Hello");
counter++;
if (counter == 100) break;
}
return sum;
}
int main()
{
double number;
scanf("%lf",&number);
printf("%g",mysin(number));
//printf("%g",number);
}
答案 0 :(得分:2)
问题在于您每一步都乘以 neg_pos
,这会在 +1 和 -1 之间切换。这意味着术语只有一半的时间会改变符号,而它们每次都应该改变符号。
解决方法是每次只乘以 -1 而不是 neg_pos
。
这是您的程序的一个有效的、稍微简化的形式,用于计算从 0 到 3 的一系列数字的 sin,显示要比较的 stdlib 计算。
#include <math.h>
#include <stdio.h>
double mysin(double x) {
double value = x;
double sum = x;
int fac = 1;
for (int counter = 0; counter < 100; counter++) {
fac += 2;
value = -value*x*x/fac/(fac-1);
sum += value;
}
return sum;
}
int main() {
for (double x = 0.0; x < 3.0; x += 0.1) {
printf("%g: %g %g\n", x, mysin(x), sin(x));
}
}
您也可以避免使用单独的 fac
和 counter
变量,可能像这样:
double mysin(double x) {
double term=x, sum=x;
for (int f = 0; f < 100; f++) {
term = -term*x*x/(2*f+2)/(2*f+3);
sum += term;
}
return sum;
}
答案 1 :(得分:-1)
据我所知,您没有正确计算功率 首先使用这个:
#include <math.h>
然后创建阶乘函数:
int factorial(int x){
int result = 1;
for(int i = 1; i < x; i++){
result += result * i;
}
return result;
}
最后:
while(1)
{
neg_pos *= -1;
fac += 2;
power = pow(x,fac);
fac = factorial(fac);
sum += power/fac;
//printf("Hello");
counter++;
if (counter == 100) break;
}